#A ASC
本题总分:5 分
问题描述
已知大写字母 A 的 A S C I I码为 65 ,请问大写字母 L 的 A S C I I 码是多少?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
76
// #A ASC
public static void main(String[] args) {
// 已知大写字母 A 的 ASCII 码为 65
// 请问大写字母 L 的 ASCII 码是多少?
//因为ASCII码没有改变可以直接输出其ASCII码值。
System.out.println('L'+0);
}
#B 空间
本题总分:5 分
问题描述
小蓝准备用 256 M B 的内存空间开一个数组,数组的每个元素都是 32 位二进制整数,如果不考虑程序占用的空间和维护内存需要的辅助空间,请问 256 M B 的空间可以存储多少个 32 位二进制整数?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
67108864
// #B 空间
public static void main(String[] args) {
// 1B=8b 1MB=2^10KB=2^20B
System.out.println(64*1024*1024);
}
#C 卡片
本题总分:10 分
问题描述
小蓝有很多数字卡片,每张卡片上都是数字 0 到 9 。
小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。
小蓝想知道自己能从 1 拼到多少。
例如,当小蓝有 30 张卡片,其中 0 到 9 各 3 张,则小蓝可以拼出 1 到 10 ,但是拼 11 时卡片 1 已经只有一张了,不够拼出 11 。
现在小蓝手里有 0 到 9 的卡片各 2021张,共 20210 张,请问小蓝可以从 1 拼到多少?
提示:建议使用计算机编程解决问题。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
3181
// #C 卡片
public static int arr[]=new int[10];
public static void main(String[] args) {
// 0-9的数字各2021张
for(int i=0;i<10;i++)arr[i]=2021;
// 循环看能拼到多少数字
for(int i=1;i<5000;i++){
// 判断能否组成,组成则数字会减去一个
if(!del(i)){
System.out.println(i-1);
break;
}
}
}
// 进行判断是否能够组成数字
public static boolean del(int x){
while(x!=0){
arr[x%10]--;
if(arr[x%10]<0)return false;
x/=10;
}
return true;
}
#D 相乘
本题总分:10 分
问题描述
小蓝发现,他将 1 至 1000000007 之间的不同的数与 2021 相乘后再求除以1000000007 的余数,会得到不同的数。
小蓝想知道,能不能在 1 至 1000000007 之间找到一个数,与 2021 相乘后再除以1000000007后的余数为 999999999。如果存在,请在答案中提交这个数;
如果不存在,请在答案中提交 0 。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
17812964
// #D 相乘
public static void main(String[] args) {
// a控制判断是否存在该数
int a=1;
// 循环1-1000000007的数
for(int i=1;i<=1000000007;i++) {
// 将每个数都与2021相乘
int t=i*2021;
// 然后判断与1000000007相除之后的余数是否为999999999
if((long)t%1000000007==999999999) {
a=a+1;
// 若是则输出该数
System.out.println(i);
break;
}
}
// 若a没有变化则说明数不存在,若有变化则证明数存在
if(a!=2) {
System.out.println(0);
}
}
#E 路径
本题总分:15 分
问题描述
小蓝学习了最短路径之后特别高兴,他定义了一个特别的图,希望找到图中的最短路径。
小蓝的图由 2021 个结点组成,依次编号 1 至 2021 。对于两个不同的结点 a , b ,如果 a 和 b的差的绝对值大于 21 ,则两个结点之间没有边相连;如果 a 和 b 的差的绝对值小于等于 21 ,则两个点之间有一条长度为 a 和 b 的最小公倍数的无向边相连。
例如:结点 1 和结点 23 之间没有边相连;结点 3 和结点 24 之间有一条无向边,长度为 24 ;结点 15 和结点 25之间有一条无向边,长度为 75 。
请计算,结点 1 和结点 2021 之间的最短路径长度是多少。
提示:建议使用计算机编程解决问题。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
10266837
import java.util.PriorityQueue;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Queue;
import java.util.List;
public class questionE {
// #E 路径
int N = 2021;
void main() {
// TODO Auto-generated method stub
List<Edge>[] graph = new List[N + 1];
long[] visited = new long[N + 1];
for (int i = 1; i <= N; i++)
graph[i] = new ArrayList();
for (int v = 1; v < N; v++)
for (int w = v + 1; w <= min(v + 21, N); w++) {
graph[v].add(new Edge(w, lcm(v, w)));
graph[w].add(new Edge(v, lcm(v, w)));
}
Queue<Vertex> queue = new PriorityQueue();
Arrays.fill(visited, Long.MAX_VALUE);
queue.offer(new Vertex(1, 0));
Vertex V = null;
while (queue.size() > 0) {
V = queue.poll();
if (V.v == N) break;
if (V.weight >= visited[V.v]) continue;
visited[V.v] = V.weight;
for (Edge edge : graph[V.v])
queue.offer(new Vertex(edge.w, edge.weight + V.weight));
}
System.out.println(V.weight);
}
int min(int a, int b) { return a < b ? a : b; }
int lcm(int a, int b) { return a * b / gcd(a, b); }
int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
class Edge {
int w, weight;
Edge(int w, int weight) {
this.weight = weight;
this.w = w;
}
}
class Vertex implements Comparable<Vertex> {
int v;
long weight;
Vertex(int v, long weight) {
this.weight = weight;
this.v = v;
}
@Override
public int compareTo(Vertex V) { return Long.compare(this.weight, V.weight); }
}
}