个人题目理解不一定对,仅供参考,各位大佬勿喷
第一题
2429042904288
考场上暴力找规律,最后发现第n个被报出的数就是n×12,于是:202420242024L×12得出答案。
第二题
暴力模拟
7913837
package 第十五届省赛;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
public class 类斐波拉契数列 {
static BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer st1=new StreamTokenizer(bf);
static PrintWriter pw=new PrintWriter(new OutputStreamWriter(System.out));
static int N=(int) 1e7;
static int a[]=new int[N];
public static void main(String[] args) throws IOException {
for(int i=N;i>=0;i--) {
if(check(i)) {
System.out.println(i);
break;
}
}
}
private static boolean check(int num) {
String s=num+"";
int i=0;
for(i=1;i<=s.length();i++) {
a[i]=s.charAt(i-1)-'0';
}
int len=s.length();
while(a[i-1]<num) { //i==4
int sum=0;
for(int j=i-len;j<i;j++) { //1-3
sum+=a[j];
}
a[i]=sum;
i++;
}
if(a[i-1]==num) return true;
return false;
}
static int I() throws IOException {
st1.nextToken();
return (int)st1.nval;
}
}
第三题
一道简单模拟,因为不要求输出元素值,所以就没必要把值给存下来了
package 第十五届省赛;
import java.util.Scanner;
public class 分布式队列 {
static Scanner sc=new Scanner(System.in);
static int N=20;
static int n,cnt;
static int count[]=new int[N];//每一个子节点含有的元素个数
public static void main(String[] args) {
n=sc.nextInt();
sc.nextLine(); //这里要吸收掉缓冲区留下的回车
while(sc.hasNext()) {//题目只说包含多行输入,我只想到用这个来阻塞输入了
String s[]=sc.nextLine().split(" ");
if("add".equals(s[0])) {
cnt++; //直接存主节点个数就行了
}
else if("sync".equals(s[0])){
int idx=Int(s[1]);
int c=count[idx];
if(c<cnt) count[idx]++; //这里得预防题目先让你sync再add的情况
}
else {
int min=cnt;
if(cnt==0) System.out.println(0); //主节点为0,那子节点肯定就是0
else {
for(int i=1;i<=n-1;i++) { //主节点也算在n里面,所以子节点个数为n-1
if(count[i]<min) {
min=count[i];
}
}
System.out.println(min);
}
}
}
}
static int Int(String s) {
return Integer.parseInt(s);
}
}
第四题
看着像多重背包,套模板了,但是c网上只过了两个样例
package 第十五届省赛;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
public class 食堂 { //多重背包 复杂度:3*600*8*100=1440000 1e7
static BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer st1=new StreamTokenizer(bf);
static PrintWriter pw=new PrintWriter(new OutputStreamWriter(System.out));
static int N=110;
static int dp[]=new int[N];
static int a[]=new int[N];//存储寝室个数
static int b4,b6,m;
static int q;
public static void main(String[] args) throws IOException {//19:05-19:33
q=I();
while(q--!=0) {
for(int i=2;i<=4;i++) {
a[i]=I();
}
b4=I();
b6=I();
m=4*b4+6*b6;
for(int i=2;i<=4;i++) {
for(int j=m;j>=i;j--) {
for(int k=0;k<=a[i]&&k*i<=j;k++) {
dp[j]=Math.max(dp[j], dp[j-k*i]+k*i);
}
}
}
System.out.println(dp[m]);
}
}
static int I() throws IOException {
st1.nextToken();
return (int)st1.nval;
}
}
第五题
看着像是一道高中数学题?而且还是c++第11届的《合并检测》缝补而来。不过有点不一样,这题要求平均分成若干组,不能有剩。
package 第十五届省赛;
import java.util.Scanner;
public class 最优分组 {
static Scanner sc=new Scanner(System.in);
static int N=(int) (1e6+10);
static int n;
static int ans=1; //必须初始化为1,不然可能
public static void main(String[] args){
int n=sc.nextInt();
double p=sc.nextDouble();
double min=n;
for(int k=1;k<=n;k++) {
if(n%k==0) {
double pt=Math.pow((1-p), k);//每一组内没有一人感染的概率
double num=(1-pt)*n+n/k; //需要使用的总试剂数
if(min>num) {
min=num;
ans=k;
}
}
}
System.out.println(ans);
}
}
第六题
考前一直在复习单源最短路径,并且看到了n<=1000,考场上想的是floyd会不会超时,所以就背了dijkstra的堆优化版本来写这题,但是由于代码背错了,最后10min才改成了floyd代码交了。
——————————————————————————————
考完后仔细算了一下复杂度,发现这道题有q次询问,如果用dijkstra的话,每次询问都要执行一遍,即使是堆优化版的dijkstra,手算了一下复杂度,也得到达10的9次方级别。。。比floyd还要高一些(常数要大一些)。
下面是floyd版代码:
——————————————————————————————
我感觉floyd是正解,但不知道为什么,在c网交了之后,只能过1个样例。。。
package 第十五届省赛;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
public class 星际旅行 {
static BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer st1=new StreamTokenizer(bf);
static PrintWriter pw=new PrintWriter(new OutputStreamWriter(System.out));
static int N=(int) (1e3+10),M=2*N,INF=0x3f3f3f3f;
static int n,m,q,count,ans;
static int dp[][]=new int[N][N];
public static void main(String[] args) throws IOException {
n=I();
m=I();
q=I();
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
if(i==j) dp[i][j]=0;
else {
dp[i][j]=INF;
}
}
}
for(int i=1;i<=m;i++) {
int a=I();
int b=I();
dp[a][b]=1;
dp[b][a]=1;
}
floyd();
int t=q;
while(t--!=0) {
int s=I();
int cnt=I();
for(int i=1;i<=n;i++) {
if(dp[s][i]<=cnt) {
count++;
}
}
}
System.out.printf("%.2f",1.0*Math.round(count/q));
}
private static void floyd() {
for(int k=1;k<=n;k++) {
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
dp[i][j]=Math.min(dp[i][j], dp[i][k]+dp[k][j]);
}
}
}
}
static int I() throws IOException {
st1.nextToken();
return (int)st1.nval;
}
}
————————————————————————————————
G题和H题还没写,后面想补题的时候再更新吧。。。
第七题
第八题