其他分享
首页 > 其他分享> > 12.26vj训练补题

12.26vj训练补题

作者:互联网

D.City Day

题意:就是给定n,x,y,以及这n天的下雨量ai,要求这一天的下雨量是这一天前x天到后y天的下雨量中最小的。输出最早的(下标最小的)d。保证答案一定存在

思路:直接遍历寻找就好了,做好标记

代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 const int maxx=1e5+10;
 8 int main(){
 9     int n,x,y;
10     scanf("%d %d %d",&n,&x,&y);
11     int a[maxx];
12     for(int i=1;i<=n;i++){
13         scanf("%d",&a[i]);
14     }
15     int fl=0;
16     for(int i=1;i<=n;i++){
17         int flag=0;
18         for(int j=1;j<=x;j++){
19             if(a[i-j]<a[i]&&i-j>0){
20                 flag=1;
21             }else if(i-j<=0){
22                 break;
23             }
24         }
25         for(int j=1;j<=y;j++){
26             if(a[j+i]<a[i]&&i+j<=n){
27                 flag=1;
28             }else if(i+j>n){
29                 break;
30             }
31         }
32 
33         if(flag==0){
34             fl=i;
35             break;
36         }
37     }
38     printf("%d",fl);
39 }
View Code

E.Water Lily

题目:荷花如图所示,距离水面H,倾斜后离竖直位置的水平距离为L,求水面高度

思路:直接根据已知,设勾股定理的未知等式进行求解

代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 const int maxx=1e5+10;
 8 int main(){
 9     double l,h,x;
10     scanf("%lf %lf",&h,&l);
11     x=(l*l-h*h)*1.0/(2*h);
12     printf("%f\n",x);
13 }
View Code

F.MP3

题目:大小为n的数组,K 个不同值,需要 k=ceil(log2K) 位存储每个值,整个数组需要n 位存储,现在需要压缩到 8∗I ,求需要改变的数的最小值。

思路:先把数组转化为,从小到大排序,然后开定一个新的数组存储,从小到大的这些数相同的有多少个,然后如果存储空间可以存下,直接进行输出即可,如果不能找到就进行查找,保留的数组最大是多少,先计算一下,然后用前缀和进行寻找个数最多的数组,然后用总共的总数减去保留的最大的总数就是输出所要删去个数的多少

思考:觉得这个题真的是难以读明白题,从开始做的时候,就没办法了感觉自己读明白了,又没有读明白,就感觉很绕,后来就得慢慢的变读题,边缕题意,这个题是耗费时间最长的一个题

代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 const int maxx=4e5+1;
 8 int a[maxx];
 9 int b[maxx]={0};
10 int main(){
11     //int a[maxx];
12     int n,i,k,kk;
13     scanf("%d %d",&n,&i);
14     //int b[maxx]={0};
15     for(int i=0;i<n;i++){
16         scanf("%d",&a[i]);
17     }
18     sort(a,a+n);
19     int flag=0;
20     int sum=0;
21     int j=0;
22     long long int p=0;
23     for(int i=0;i<n;i++){
24         if(i==0){
25             sum++;//同类一共多少
26             flag++;//不同类一共多少
27         }else{
28             if(a[i]==a[i-1]){
29                 sum++;
30             }else{
31                 b[j]=sum;
32                 //printf("i:%d a[i]:%d sum:%d\n",i,a[i-1],sum);
33                 sum=1;
34                 j++;
35                 flag++;
36 
37             }
38             if(i==n-1&&a[i]==a[i-1]){
39                 b[j]=sum;
40                 sum=1;
41                 j++;
42             }else if(i==n-1){
43                 b[j]=1;
44                 j++;
45             }
46         }
47     }
48     kk=flag;
49     k=log2(kk);
50     if(pow(2,k)!=kk){
51         k++;
52     }
53     //printf("k:%d\n",k);
54    // printf("k;%d\n",k);
55     if(8*i>=n*k){
56         printf("0");
57     }else{
58         int p=8*i/n;
59         int s=pow(2,p);
60         int summ=0;//找到间断s区间最大的
61         //printf("s:%d\n",s);
62         int c[maxx]={0};
63         //printf("j:%d\n",j);
64         for(int i=0;i<j;i++){
65             if(i-1>=0){
66                 c[i]+=c[i-1]+b[i];
67             }else{
68                 c[i]=b[i];
69             }
70             //printf("%d ",c[i]);
71         }
72        // printf("\n");
73         summ=0;
74         int little=0;
75         for(int i=0;i<j;i++){
76             if(i-s+1==0){
77                 little=c[i];
78             }else if(i-s+1>0){
79                 little=c[i]-c[i-s+1]+b[i-s+1];
80             }
81             summ=max(little,summ);
82         }
83         printf("%d",c[j-1]-summ);
84 
85     }
86 }
View Code

J.Tokitsukaze and Enhancement

题目:一个数除4余1那么就是等级A,余3就是等级B,余2就是等级C,余0就是等级D,并且等级A>B>C>D,如果一个数最多能增加2,那么它最少需要增加多少,并且此时等级最高是多少

思路:这个数,这个数+1,这个数+2都表示出来进行比较

代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 const int maxx=1e5+10;
 8 int main(){
 9     int n;
10     scanf("%d",&n);
11     int n1,n2;
12     n1=(n+1)%4;
13     n2=(n+2)%4;
14     n=n%4;
15     if(n==1){
16         printf("0 A\n");
17     }else if(n1==1){
18         printf("1 A\n");
19     }else if(n2==1){
20         printf("2 A\n");
21     }else if(n==3){
22         printf("0 B\n");
23     }else if(n1==3){
24         printf("1 B\n");
25     }else if(n2==3){
26         printf("2 B\n");
27     }
28 }
View Code

K.Tokitsukaze and Mahjong

题目:只有所给三个数个数是顺子并且是是同种类型的,或者是三个数相等并且是同种类型的才可以,现在问变成题目中所给类型的任意一种需要改变多少个数

思路:巧用数组进行存储比较

代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 const int maxx=4e5+1;
 8 long long int a[maxx];
 9 long long int b[maxx]={0};
10 int main(){
11     int s[10]={0};
12     int p[10]={0};
13     int m[10]={0};
14     int n=10;
15     for(int i=0;i<3;i++){
16         int num=0;
17         char c;
18         scanf("%1d%c",&num,&c);
19         if(c=='s'){
20             s[num]++;
21         }else if(c=='p'){
22             p[num]++;
23         }else if(c=='m'){
24             m[num]++;
25         }
26     }
27     int flag=0;
28     for(int i=0;i<n;i++){//三个相同 0
29         if(s[i]==3||p[i]==3||m[i]==3){
30             flag=1;
31         }
32     }
33     for(int i=0;i<n;i++){//顺子--0
34         if(s[i]==1&&s[i+1]==1&&s[i+2]==1&&i+2<10){
35             flag=1;
36         }else if(m[i]==1&&m[i+1]==1&&m[i+2]==1&&i+2<10){
37             flag=1;
38         }else if(p[i]==1&&p[i+1]==1&&p[i+2]==1&&i+2<10){
39             flag=1;
40         }
41     }
42     if(flag==1){
43         printf("0\n");
44     }else{
45         for(int i=0;i<n;i++){
46             if(s[i]==2||p[i]==2||m[i]==2){
47                 flag=1;
48             }
49         }//两个相同
50         for(int i=0;i<n;i++){
51             if(s[i]>0&&s[i+1]>0&&i+1<10){
52                 flag=1;
53             }else if(p[i]>0&&p[i+1]>0&&i+1<10){
54                 flag=1;
55             }else if(m[i]>0&&m[i+1]>0&&i+1<10){
56                 flag=1;
57             }
58         }//两个紧挨着形成顺子
59         for(int i=0;i<n;i++){
60             if(s[i]>0&&s[i+2]>0&&i+2<10){
61                 flag=1;
62             }else if(p[i]>0&&p[i+2]>0&&i+2<10){
63                 flag=1;
64             }else if(m[i]>0&&m[i+2]>0&&i+2<10){
65                 flag=1;
66             }
67         }//空一格形成顺子
68         if(flag==1){
69             printf("1\n");
70         }else{
71             printf("2\n");
72         }
73     }
74 }
View Code

L.Tokitsukaze and Discard Items

题目:一开始有n个数,这些数从1到n编号,每k个数为一组,现在给出m个要删去的特殊数,有一种操作,从第一个包含特殊数的组开始删,一次可以把一组里所有特殊数删掉,删掉数后会有空位,这些空位会被后面的数依次补上,并形成新的组,问最少需要操作多少次

思路:我就用他们的相对位置是不是变动的时候在一页上面比如一个变动完成以后,剩下的多少个都是存在的第一页上的,那就直接忽略,在for循环里面套了一个while循环

代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 using namespace std;
 8 const int maxx=1e5+10;
 9 long long int a[maxx];
10 long long int b[maxx]={0};
11 int main(){
12     long long int n,m,k;
13     scanf("%lld %lld %lld",&n,&m,&k);
14     for(long long int i=0;i<m;i++){
15         scanf("%lld",&a[i]);
16     }
17     sort(a,a+m);
18     long long int sum0=0;
19     long long int flag=(a[0]+(k-1))/k;
20     long long int flagi=0;
21     long long int sum=1;
22     for(long long int i=0;i<m;i++){
23         if((a[i]+(k-1))/k==flag){
24             sum0++;
25             flagi=i;
26         }else{
27             break;
28         }
29     }//sum0--满足条件的第一页上含有的特殊数的个数
30     for(long long int i=flagi+1;i<m;i++){
31         long  long int j=i;
32         long long int sum1=0;
33         long long int t=(a[i]-sum0+k-1)/k;
34         while((a[j]-sum0+k-1)/k==t){
35             sum1++;
36             j++;
37         }
38         sum0+=sum1;
39         i=i+sum1-1;
40         sum++;
41     }
42     //printf("flagi:%d\n",flagi);
43     printf("%lld\n",sum);
44 
45 
46 
47 }
View Code

感受:这次个人赛总的来说感觉还好,没有wa掉很多的题,一个题也没有wa很多,现在越来越觉得边刷题边学习算法还有一些思维思路才是真正适合自己的方式,只是最近一直在忙着复习也没太多的时间来补cf了,慢慢的也感觉到了自己能力的提升,找到了更浓厚的乐趣,希望赶紧考完试然后就能有时间学习了,好好考试,好好学习算法

 

标签:10,maxx,int,vj,12.26,补题,&&,printf,include
来源: https://www.cnblogs.com/bonel/p/14224227.html