有一个 Olympiad 问题,内存限制为 256 MB。我需要创建一个 100000 x 100000 矩阵。当我这样做时,会抛出 OutOfMemoryException。怎么打?UPD:谢谢你的回答,明白了。
Dr. kott9ra's questions
有一个问题,很简单,我想。解决方案马上就来了:我们寻找天数的最大值(d-th),并输出它是星期几。因为要让他们相遇,所有的日子都必须是最长的一天的除数。(我们得到一个天数组,并按降序排序,所有元素都是第一个元素的除数)测试 4 失败。我找不到错误。
格林德沃想要召集他的支持者。但是,不幸的是,他不能每天都这样做。格林德沃总共有 n 个支持者。让我们将它们从 1 编号到 n。第 i 号支持者基于个人信念,每隔 di 天(即如果第 i 号支持者两次访问之间的间隔为 di 天)访问会面地点。格林德沃记得,上一次他的所有支持者同时出现在集会地点是在星期几,编号为 s。帮助他确定一周中的哪一天,所有支持者将再次同时出现在集合地点。回想一下,一周有 7 天,格林德沃按照 1 到 7 的顺序对它们进行编号
下列的。 输入格式 输入 的第一行包含两个整数 n 和 s (1 ⩽ n ⩽ 105 , 1 ⩽ s ⩽ 7)。第二行包含 n 个整数 di (1 ⩽ di ⩽ 20)。输出数据格式 输出1到7的单个数字——星期几
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.StringTokenizer;
import static java.lang.Integer.parseInt;
/**
* Created by Andrey on 31.12.2018.
*/
public class Main {
static int scanInt() throws IOException {
return parseInt(scanString());
}
static String scanString() throws IOException {
while (tok == null || !tok.hasMoreTokens()) {
tok = new StringTokenizer(in.readLine());
}
return tok.nextToken();
}
static BufferedReader in;
static StringTokenizer tok;
public static void main(String[] args) throws IOException {
in = new BufferedReader(new InputStreamReader(System.in));
int n = scanInt();
int s = scanInt();
ArrayList<Integer> days = new ArrayList<>();
for(int i = 0; i < n; ++i){
days.add(scanInt());
}
days.sort(Collections.reverseOrder());
ArrayList<Integer> week = new ArrayList<>();
for(int i = 0; i < 1000; ++i){
week.add(1);
week.add(2);
week.add(3);
week.add(4);
week.add(5);
week.add(6);
week.add(7);
}
System.out.println(week.get(s+days.get(0) - 1));
}
}
有一个任务:
第一行包含两个整数 1≤n≤50000 和 1≤m≤50000——分别是线上的线段数和点数。接下来的 n 行包含两个整数 ai 和 bi (ai ≤ bi)——线段末端的坐标。最后一行包含 m 个整数——点的坐标。所有坐标不超过 10^8 模。如果一个点在它内部或在边界上,则它被认为属于一个线段。对于每个点,按照在输入中出现的顺序,输出它属于多少个段。
我想出了一个解决方案:从头开始对段进行排序。此外,我们在点和段上运行。我们看,如果该点属于段,那么我们增加计数器,并注意它至少属于一个段。接下来,我们看,如果该点不属于任何段,但属于至少一个段,那么它也不属于所有后续段。(因为这些段是按初始坐标的升序排列的)。但我对一项测试有疑问:
[6 6]
[2 3]
[2 5]
[3 5]
[2 7]
[5 7]
[3 7]
段,1 2 3 5 6 7 - 点。当答案是 0 3 5 5 3 3 时给出 0 3 5 5 1 1。我想知道我的算法中的错误在哪里。如果是的话,请把我推向正确的解决方案:)
导入 java.io.BufferedReader;导入 java.io.IOException;导入 java.io.InputStreamReader;导入 java.util.*;
import static java.lang.Integer.parseInt; /** * Created by Andrey on 31.12.2018. */ public class Stepic { static int scanInt() throws IOException { return parseInt(scanString()); } static String scanString() throws IOException { while (tok == null || !tok.hasMoreTokens()) { tok = new StringTokenizer(in.readLine()); } return tok.nextToken(); } static BufferedReader in; static StringTokenizer tok; public static void main(String[] args) throws IOException { in = new BufferedReader(new InputStreamReader(System.in)); int n = scanInt(); int m = scanInt(); int[] ans = new int[m]; List<Segment> segments = new ArrayList<>(); for(int i = 0 ; i < n; i++){ segments.add(new Segment(scanInt(),scanInt())); } segments.sort(Comparator.comparingInt(o -> o.x)); int[] dots = new int[m]; boolean[] dotsB = new boolean[m]; for(int i = 0; i < m; i++){ dots[i] = scanInt(); } for(int i = 0; i < dots.length; i++){ for (Segment segment : segments) { if (segment.x <= dots[i] && segment.y >= dots[i]) { ans[i]++; dotsB[i] = true; } else { if (dotsB[i]) { break; } } } } for(Segment segment : segments){ System.out.println(segment.x + " " + segment.y); } for (int an : ans) { System.out.print(an + " "); } } public static class Segment{ public int x; public int y; public Segment(int x, int y) { this.x = x; this.y = y; } } }
我正在阅读 Joseph Hawking 的 Unity in Action。我目前在第 3 章,我们正在编写第一人称射击游戏。我不清楚投掷光束的方法是如何实现的(对于投篮的实现,还有几点)。请参阅代码中的注释。请给我解释一下,提前谢谢!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RaySh : MonoBehaviour {
private Camera camera;
// Use this for initialization
void Start () {
camera = GetComponent<Camera>();
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
void OnGUI(){
int size = 12;
float posX = camera.pixelWidth / 2 - size / 4; //зачем здесь вычитается size / 4
float posY = camera.pixelHeight / 2 - size / 2; //зачем здесь вычитается size / 2
GUI.contentColor = Color.black;
GUI.Label(new Rect(posX, posY, size, size), "*");
}
// Update is called once per frame
void Update () {
if(Input.GetMouseButtonDown(0)){ // полностью не понятен метод бросания луча (код ниже)
Vector3 point = new Vector3(camera.pixelWidth / 2, camera.pixelHeight / 2, 0);
Ray ray = camera.ScreenPointToRay(point);
RaycastHit hit;
if(Physics.Raycast(ray, out hit)){
StartCoroutine(SphereIndicator(hit.point));
}
}
}
private IEnumerator SphereIndicator(Vector3 pos){
GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
sphere.transform.position = pos;
yield return new WaitForSeconds(1);
Destroy(sphere);
}
}