8/14考试 JWG

考试的题目,看似简单,实际上肥肠困难简单。

吓得我差点把内存给炸了

     内存---.__O
_________    |\
\  油  锅  /    | |
  \______/      |

 

废话少说,上题目。


 第一题(course)

LCH假期过得意犹未尽,所以上信息课的时候不免打瞌睡。但是他不希望落下老师讲的知识点,所以希望老师讲到重要地方的时候叫醒他。

现在高老师告诉你每节课每分钟知识点的重要程度,并且以分数量化。

LCH会告诉你他的睡眠计划(每分钟是睡着还是清醒),但他实在太困了,所以希望你只叫醒他一次,叫醒后他会在接下来的K分钟保持清醒,然后恢复他的睡眠计划(按照给出计划睡着或者清醒)。

作为好朋友你当然希望他在有限时间内获得最多的知识,所以你希望选择一种叫醒方案,让他获得的知识量最大。

 

【输入】

第一行输入nk,用空格隔开,表示这堂课的总时间和叫醒一次能使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

【输入】

       输入若干组数据,每组数据包括一行三个数:nmk

【输出】

按照题目要求输出每组样例的第k种排列。

【输入样例】

2 2 6

1 1 1

【输出样例】

1100

01

 

题解:

敬请期待~~~

原文地址:https://www.cnblogs.com/jiaweigao/p/9475372.html