2020.12.20vj补题

 

A - Insomnia cure

 题意:一共s只龙,每隔k,l,m,n只龙就会受伤,问这s只龙有多少龙是受伤的

思路:看起来题目范围并不是很多,直接进行循环判断

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 using namespace std;
 7 int main(){
 8     int sum=0,s=0;
 9     int k,l,m,n;
10     int a[15100]={0};
11     scanf("%d",&k);
12     scanf("%d",&l);
13     scanf("%d",&m);
14     scanf("%d",&n);
15     scanf("%d",&s);
16     sum=0;
17     for(int i=1;i<=s;i++){
18         if(i%k==0){
19             sum++;
20         }else if(i%l==0){
21             sum++;
22         }else if(i%m==0){
23             sum++;
24         }else if(i%n==0){
25             sum++;
26         }
27     }
28     printf("%d\n",sum);
29 }
View Code

B - Escape

 题意:总共是c公里,公主以每小时Vp公里的速度逃跑,龙在t小时后发现公主逃跑然后开始以每小时Vd公里的速度追,当龙追上公主的时候,公主就会扔一块糖果出来,然后龙就会捡起糖果拿回最开始的位置,并且停留f小时,再继续追赶公主,问公主逃跑总共需要多少糖果

思路:分开直接进行梳理计算就可以,只是龙拿回起点以后,再追公主的时候就要重新计算一下时间,一定记得是double

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 using namespace std;
 7 int main(){
 8     double vp,vd,t,f,c;
 9     scanf("%lf",&vp);
10     scanf("%lf",&vd);
11     scanf("%lf",&t);
12     scanf("%lf",&f);
13     scanf("%lf",&c);
14     double g=vp*t;
15     int sum=0;
16     int l=0;
17     if(g>=c){
18         printf("0\n");
19     }else{
20         if(vp>=vd){
21             printf("0\n");
22         }else{
23             double m=g*1.0/(vd-vp);//第一次相遇的时间
24             double s=0;
25             g+=vp*m;//第一次相遇的位置
26            // printf("%d\n",g);
27             while(g<c){
28                 if(g<c){
29                     sum++;
30                 }else{
31                     break;
32                 }
33                 s=0;
34                 s+=f+m;
35                 g+=s*vp;//返回后公主走的位置
36                 m=g*1.0/(vd-vp);
37                 g+=m*vp;
38 
39             }
40             printf("%d",sum);
41         }
42     }
43 }
View Code

C - Terse princess

题意:有个公主找王子,如果这个人比之前所有王子的财富都高,公主就Oh,如果这个人比之前所有的财富值的总和加起来还多,就WOW,有n个人a次Oh,b次WOW。输出一个序列满足a,b,如果没有就输出-1.

思路:就是直接构造,先构造wow的数,再构造oh的数,第一个数输出是n-a-b里面的数,然后先输出b里面的数,然后再输出a的数,注意的情况就是:1)n为1,b为0,a为0的情况,直接输出1即可;2)n-a为1,b为0的情况,这样的无法构造;3)其余的情况当b的数的时候其实直接进行乘2就行,就是当b为0的时候注意一下,需要往后靠一个,因为如果b为0,a放在第二个位置,那么就会产生wow的效果

wa掉的点:一开始的大致思路是对的,就是特殊点没有考虑到,然后又改想着先输出降序的让他成为那n-a-b个数,发现也是会wa掉,这样会吹西安负数,如果前面输出都是1,这样很容易输出负数,我就想着先输出100这样进行,发现很可能也会超过50000,这样一来就用1先输出,像题目中那样,看着样例知道了当时思路中没有考虑到特殊样例,即使是在看着样例的情况下改的,发现也要wa掉10发才能够真的做对,从wa思路到wa特殊样例到wa数值范围,就一点一点的改

代码:

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

 最近补题的感想:最近也可能忙于复习,就感觉事情很多,但是干完以后自己又没有什么收获,就像是在浪费时间,从繁忙中挤出时间来一边补自己和大家一起做的cf,一边抽出时间来补自己要求比别人多补的cf,可能是最近cf都是思维题,所以可能锻炼了基本的一些思维,学到了一些新的思维精髓,也因为算法题比较少,最近一直也没有怎么好好的学习算法,就想着补题的时候看算法,系统的看从头到尾看是感觉到真的没有时间,真的感觉到:明日复明日明日何其多,但是即使wa掉很多发,但是自己又做对的感觉真的贼好,有时候比一次就做对的感觉也要好,少刷水题,水题真的没什么用处,一定坚持下去多接触接触自己踮脚可以够到的题

posted @ 2020-12-23 21:17  bonel  阅读(133)  评论(0)    收藏  举报