1. 程式人生 > 實用技巧 >2020.12.20vj補題

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的效果

程式碼:

 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