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 }
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 }
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 }

浙公网安备 33010602011771号