Codeforces Good Bye 2020 A-D

A - Bovine Dilemma

解题思路:以为题上说了是一个三角形,并且有一个确定的点(0,1),所以这里只需要找两个点便能构成一个三角形,而这两个点都在x轴上,所以可以知道(0,1)到x轴为高,x轴上两点只差为底。所以,我们只需要知道底有多少个不同的值即可。

把每个点和之前的点做差,用一个标记数组b[x]查询差值x是否出现过(没出现过为0),如没有出现过,b[x]++;反之,sum++。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     int t,n,a[100],b[100],sum,x;
 6     scanf("%d",&t);
 7     while(t--)
 8     {
 9         memset(b,0,sizeof(b));
10         sum=0;
11         scanf("%d",&n);
12         for(int d=1;d<=n;d++)
13         {
14             scanf("%d",&a[d]);
15             for(int i=1;i<d;i++)
16             {
17                 x=a[d]-a[i];
18                 if(x<0)
19                     x=0-x;
20                 if(x!=0&&b[x]==0)
21                     sum++;
22                 b[x]++;
23             }
24         }
25         printf("%d\n",sum);
26     }
27     return 0;
28 }

B - Last minute enhancements

解题思路:本题就是找有多少个不同的数,且给的数据是递增的,所以只要对输入的数字x,查询x是否出现过(在标记数组b[ ]中),如果没出现过(即b[x]=0),说明x是一个新数,sum++,在把x标记起来,b[x]++;如果出现过,就查询x+1是否出现过,如果没出现过,说明x+1是一个新数,sum++,在把x+1标记起来,b[x+1]++。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int b[200005];
 4 int main()
 5 {
 6     int t,n,x,sum;
 7     scanf("%d",&t);
 8     while(t--)
 9     {
10         memset(b,0,sizeof(b));
11         sum=0;
12         scanf("%d",&n);
13         for(int d=1;d<=n;d++)
14         {
15             scanf("%d",&x);
16             if(b[x]==0)
17             {
18                 b[x]++;
19                 sum++;
20             }
21             else
22             {
23                 b[x+1]++;
24                 if(b[x+1]==1)
25                     sum++;
26             }
27         }
28         printf("%d\n",sum);
29     }
30     return 0;
31 }

C - Canine poetry

解题思路:本题很简单,只需要对每个字符查询它是否与它前面的那个字符或者它前面的前面的那个字符相同即可,相同就把这个字符改为出字母外的任意一个字符即可,把每次相同加起来就是答案。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 char a[100005];
 4 int main()
 5 {
 6     int n,sum;
 7     scanf("%d",&n);
 8     while(n--)
 9     {
10         sum=0;
11         scanf("%s",a);
12         for(int d=1;a[d]!='\0';d++)
13         {
14             if(a[d]==a[d-1])
15             {
16                 a[d]='!';
17                 sum++;
18             }
19             else if(a[d]==a[d-2]&&d>1)
20             {
21                 a[d]='!';
22                 sum++;
23             }
24         }
25         printf("%d\n",sum);
26     }
27     return 0;
28 }

 

D - 13th Labour of Heracles

解题思路:没改变一条路径,就会使一个端点多加一次(这个端点不能是为节点,即除这次的另一个端点外没有其他节点与之连接),所以只需要把每次建立路径的端点拿去查询(b[x]是否大于0),如没出现过(=0)就不管它;如出现过(>0)就把它保存起来(c[z]=a[x],z++)。在把c数组按从大到小排序(题上要求了的),输出n个数的和sum,在输出每加一个c[d]后的sum。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int a[100005],b[100005],c[100005];
 4 long long sum;
 5 bool cmp(int x,int y)
 6 {
 7     return x>y;
 8 }
 9 int main()
10 {
11     int t,n,x,y,z;
12     scanf("%d",&t);
13     while(t--)
14     {
15         memset(b,0,sizeof(b));
16         memset(c,0,sizeof(c));
17         sum=0;
18         z=1;
19         scanf("%d",&n);
20         for(int d=1;d<=n;d++)
21         {
22             scanf("%d",&a[d]);
23             sum+=a[d];
24         }
25         for(int d=1;d<n;d++)
26         {
27             scanf("%d%d",&x,&y);
28             b[x]++;
29             b[y]++;
30             if(b[x]>1)
31             {
32                 c[z]=a[x];
33                 z++;
34             }
35             if(b[y]>1)
36             {
37                 c[z]=a[y];
38                 z++;
39             }
40         }
41         sort(c+1,c+z,cmp);
42         z--;
43         printf("%lld ",sum);
44         for(int d=1;d<=z;d++)
45         {
46             sum+=c[d];
47             printf("%lld ",sum);
48         }
49         printf("\n");
50     }
51     return 0;
52 }

 

posted @ 2021-01-03 21:38  摸摸狗头  阅读(79)  评论(0)    收藏  举报