考试的题目,看似简单,实际上肥肠困难简单。
吓得我差点把内存给炸了
内存---.__O
_________ |\
\ 油 锅 / | |
\______/ |
🔥🔥🔥🔥
废话少说,上题目。
第一题(course)
LCH假期过得意犹未尽,所以上信息课的时候不免打瞌睡。但是他不希望落下老师讲的知识点,所以希望老师讲到重要地方的时候叫醒他。
现在高老师告诉你每节课每分钟知识点的重要程度,并且以分数量化。
LCH会告诉你他的睡眠计划(每分钟是睡着还是清醒),但他实在太困了,所以希望你只叫醒他一次,叫醒后他会在接下来的K分钟保持清醒,然后恢复他的睡眠计划(按照给出计划睡着或者清醒)。
作为好朋友你当然希望他在有限时间内获得最多的知识,所以你希望选择一种叫醒方案,让他获得的知识量最大。
【输入】
第一行输入n和k,用空格隔开,表示这堂课的总时间和叫醒一次能使LCH保持清醒的时间。
第二行输入n个用空格隔开的数,表示这节课每分钟知识点的重要程度分值ai。
第三行输入n个用空格隔开的数,表示每分钟LCH的睡眠计划,1表示他这一分钟清醒,0表示睡眠。
【输出】
LCH这堂课收获的最大知识量。
【输入样例】
6 3
1 3 5 2 5 4
1 1 0 1 0 0
【输出样例】
16
题解:
切!为什么LCH这么爱打瞌睡呢!废话少说,直接上代码:
1 #include<cstdio> 2 int main() 3 { 4 //freopen("course.in","r",stdin); 5 //freopen("course.out","w",stdout); 6 int kn[100005],sl[100005]; 7 int n,k; 8 int sum=0; 9 int i,j; 10 int qz[100005]={}; 11 scanf("%d%d",&n,&k); 12 for(i=1;i<=n;i++) 13 scanf("%d",&kn[i]); 14 for(i=1;i<=n;i++) 15 { 16 qz[i]=qz[i-1]; 17 scanf("%d",&sl[i]); 18 if(sl[i]) 19 sum+=kn[i]; 20 else 21 qz[i]+=kn[i]; 22 } 23 int ch,mxch=0; 24 for(i=k-1;i<=n;i++) 25 { 26 ch=qz[i]-qz[i-k]; 27 if(ch>mxch) 28 mxch=ch; 29 } 30 printf("%d",mxch+sum); 31 return 0; 32 }
第二题(stone)
WHM摆了N堆石子,他有点累,不想合并这些石子,所以他问了ZYC一个非常简单的问题:从左往右数第k个石子在哪一堆里?现在ZYC把这个问题分享给大家一起开心开心。
【输入】
输入第一行是一个数N,表示石子堆数。
第二行N个用空格隔开的数ai,表示从左往右第i堆有多少个石子。
第三行是一个数M,表示有M次询问。
第四行M个用空格隔开的数qi,表示WHM希望知道第qi个石子属于哪一堆。
【输出】
输出共有M行,每一行表示第qi个石子属于哪一堆。
【输入样例】
5
2 7 3 4 9
3
1 25 11
【输出样例】
1
5
3
题解:
WHM摆完石子后,强迫症的原因,他把每一堆的石子染色后按顺序排成一长串。
那么,样例就变成了这样:
①①②②②②②②②③③③④④④④⑤⑤⑤⑤⑤⑤⑤⑤⑤
▲ ▲ ▲ ▲ ▲
每堆的第一个石子分别是第1、3、10、13、17个。
典型的二分,直接上代码:
1 #include<iostream> 2 using namespace std; 3 int a,b=1,sum[1000005]={0,1}; 4 int main() 5 { 6 //freopen("stone.in","r",stdin); 7 //freopen("stone.out","w",stdout); 8 int n,k; 9 scanf("%d",&n); 10 int i,j; 11 for(i=1;i<=n;i++) 12 { 13 scanf("%d",&a); 14 sum[i]=sum[i-1]+b; 15 b=a; 16 //cout<<sum[i]<<' '; 17 } 18 //cout<<endl; 19 scanf("%d",&k); 20 for(i=1;i<=k;i++) 21 { 22 int x; 23 scanf("%d",&x); 24 int l=1,r=n; 25 while(l<r) 26 { 27 int mid=(l+r)/2+1; 28 if(sum[mid]>x) 29 r=mid-1; 30 else 31 l=mid; 32 } 33 printf("%d\n",r); 34 } 35 return 0; 36 }
第三题(ball)
【问题描述】
LQX自从上次误导大家后一直觉得特别过意不去,这次他打算换一种玩法:他一共有n个白球(0)和m个黑球(1),他希望你帮他求出如果这些球按字典序排序(0排在1前面)的话,第k种排列方式是什么?如果不存在输出-1。
【输入】
输入若干组数据,每组数据包括一行三个数:n、m和k。
【输出】
按照题目要求输出每组样例的第k种排列。
【输入样例】
2 2 6
1 1 1
【输出样例】
1100
01
题解:
敬请期待~~~