Codeforces Round #661 (Div. 3)

A. Remove Smallest

题意:数组是否满足任意i,j保证|ai-aj|<=1,如果都可以满足,输出YES,否则输出NO 

思路:直接排序遍历即可

代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<cmath>
 6 #include<queue>
 7 #include<vector>
 8 #include<set>
 9 using namespace std;
10 int main(){
11     int t;
12     scanf("%d",&t);
13     while(t--){
14         int n;
15         scanf("%d",&n);
16         int a[100];
17         for(int i=0;i<n;i++){
18             scanf("%d",&a[i]);
19         }
20         sort(a,a+n);
21         int flag=0;
22         for(int i=1;i<n;i++){
23             if(a[i]-a[i-1]>1){
24                 flag=1;
25                 break;
26             }
27         }
28         if(flag==0){
29             printf("YES\n");
30         }else{
31             printf("NO\n");
32         }
33     }
34 }
View Code

B. Gifts Fixing

题意:两组数a[i],b[i],你可以对两组数的数字进行如下操作:1.加减1;2.同一位置的数一起加减1,则使得a1=a2=a3....=an,并且b1=b2=b3.....=bn,那么需要最少进行多少步

思路:先找出两组数中每组里面最小的那个数,每次循环进行比较a[i]与a[min],再找到a[i]和b[i]最大的那个数,直接算其和

代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<cmath>
 6 #include<queue>
 7 #include<vector>
 8 #include<set>
 9  
10 using namespace std;
11 pair<int,int> a[100];
12 int main(){
13     int t;
14     scanf("%d",&t);
15     while(t--){
16         int n;
17         scanf("%d",&n);
18         long long int sum=0;
19         int minn1=1e9,minn2=1e9;
20         for(int i=0;i<n;i++){
21             scanf("%d",&a[i].first);
22             minn1=min(minn1,a[i].first);
23         }
24         for(int i=0;i<n;i++){
25             scanf("%d",&a[i].second);
26             minn2=min(minn2,a[i].second);
27         }
28         sort(a,a+n);
29         for(int i=0;i<n;i++){
30             sum+=max(a[i].second-minn2,a[i].first-minn1);
31         }
32         printf("%lld\n",sum);
33     }
34 }
View Code

C. Boats Competition

题意:一组数从中抽取两个数,保证a[1]+b[1]=a[2]+b[2]……=a[k]+b[k],一共最多可以抽取多少组

思路:直接进行统计,抽取的两个数只有两种情况,一种是等差中项是整数的,例如1.2.3;一种是等差中项不是整数的,例如1.2.3.4;直接存储其数值个数,进行循环比较最多,一定注意是取两个数的最小值,不是平均值,并且遍历的时候要从第一个for循环的i入手往前走,不要从1开始走

代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<cmath>
 6 #include<queue>
 7 #include<vector>
 8 #include<set>
 9 using namespace std;
10  
11 int main(){
12     int t;
13     scanf("%d",&t);
14     while(t--){
15         int n;
16         scanf("%d",&n);
17         int a[60][2]={0};
18         int numl;
19  
20         for(int i=1;i<=60;i++){
21             a[i][0]=i;
22         }
23         for(int i=1;i<=n;i++){
24             scanf("%d",&numl);
25             a[numl][1]++;
26         }
27         int sum=0,num=0;
28         for(int i=1;i<=n;i++){
29                 num=0;
30                 num+=a[i][1]/2;
31             for(int j=i-1;j>=1&&2*i-j<=n&&2*i-j>i;j--){
32                 if(a[2*i-j][1]==0||a[j][1]==0){
33                     continue;
34                 }else{
35                 num+=min(a[j][1],a[2*i-j][1]);
36                 }
37             }
38             sum=max(num,sum);
39         }
40         for(int i=1;i<=n;i++){
41             num=0;
42             if(a[i][1]==0||a[i+1][1]==0){
43  
44             }else{
45                 num+=min(a[i][1],a[i+1][1]);
46             }
47             for(int j=i-1;j>=1&&2*i+1-j<=n&&2*i+1-j>i+1;j--){
48                 if(a[j][1]==0||a[2*i+1-j][1]==0){
49                     continue;
50                 }else{
51                 num+=min(a[j][1],a[2*i+1-j][1]);
52  
53                 }
54             }
55             sum=max(num,sum);
56         }
57         if(n==2){
58             printf("1\n");
59             continue;
60         }else{
61             printf("%d\n",sum);
62         }
63  
64     }
65 }
View Code

 

posted @ 2020-08-07 22:21  bonel  阅读(160)  评论(0)    收藏  举报