Codeforces Round #552 (Div. 3)
A. Restoring Three Numbers
题意:
给出 a+b,a+c,b+c,a+b+c 三个数,求a,b,c;
思路:
不妨设 a < b < c,那么 a+b < a+c < b+c < a+b+c;
假设 a+b = x , a+c = y , b+c = z , a+b+c = k;
那么 a = x-b , c = z-b , 带入 a+b+c = k中得
(x-b)+b+(z-b) = k;
x+z-b=k ⇔b=x+z-k
a=x-b;
c=y-b;
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int a[5]; 5 int main() 6 { 7 // freopen("C:\\Users\\hyacinthLJP\\Desktop\\in&&out\\contest","r",stdin); 8 for(int i=1;i <= 4;++i) 9 scanf("%d",a+i); 10 sort(a+1,a+5); 11 int aa=a[4]-a[3]; 12 int b=a[1]+a[3]-a[4]; 13 int c=a[4]-a[1]; 14 printf("%d %d %d\n",aa,b,c); 15 }
B. Make Them Equal
题意:
给出一个包含 n 个元素得序列a[],每个数a[ i ]有三种操作:a[ i ] += d , a[ i ] -= d , 不操做;
判断是否存在非负数 d ,∀i ∈[1,n] 使得a[ i ]在经过这三种变化后 a[1]=a[2]=.......=a[n];
如果可以,输出最小的d;
反之,输出-1;
思路:
①排序,去重
②如果去重后,元素个数为1,输出0
③去重后,元素个数为2,判断 (a[2]-a[1]) 是否为偶数,如果是,输出(a[2]-a[1])/2,反之,输出a[2]-a[1];
④去重后,元素个数为3,判断 a[2]-a[1] 是否等于 a[3]-a[2] ,如果等于,输出a[3]-a[2],反之输出-1;
⑤去重后,元素个数 > 3,输出-1;
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int n; 5 int a[150]; 6 7 int Solve() 8 { 9 sort(a+1,a+n+1); 10 int t=unique(a+1,a+n+1)-a; 11 t--; 12 if(t == 1) 13 return 0; 14 if(t == 2) 15 return ((a[2]-a[1])&1) ? a[2]-a[1]:(a[2]-a[1])/2; 16 if(t == 3) 17 return a[3]-a[2] == a[2]-a[1] ? a[3]-a[2]:-1; 18 return -1; 19 20 } 21 int main() 22 { 23 // freopen("C:\\Users\\hyacinthLJP\\Desktop\\in&&out\\contest","r",stdin); 24 while(~scanf("%d",&n)) 25 { 26 for(int i=1;i <= n;++i) 27 scanf("%d",a+i); 28 printf("%d\n",Solve()); 29 } 30 return 0; 31 }
C. Gourmet Cat
题意:
有个贪吃的小猫咪,不过还挺有原则;
在周一,四,日只吃 finish;
在周二,六只吃 rabbit stew;
在周三,五只吃 chicken stake;
给出三个整数 a,b,c 分别代表 finish,rabbit stew,chicken stake 的个数;
这只猫最多可连续吃几天?(没有额外的食物供应,且每天都要吃相应的食物)
思路:
枚举第 i 周为第一天的情况,输出最大值;
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define INF 0x3f3f3f3f 5 #define INFL 0x3f3f3f3f3f3f3f3f 6 7 // 1,2,3,4,5,6,7 8 int da[8]= {0,1,0,0,1,0,0,1};//da[i]:0周i不吃食物a,1周i吃食物a 9 int db[8]= {0,0,1,0,0,0,1,0}; 10 int dc[8]= {0,0,0,1,0,1,0,0}; 11 int suma[8]={0,3,2,2,2,1,1,1};//suma[i]:周[1,i]吃suma[i]个食物a 12 int sumb[8]={0,2,2,1,1,1,1,0}; 13 int sumc[8]={0,2,2,2,1,1,0,0}; 14 15 int Check(int *d,int x,int res)//在周[x,7]范围内,求出剩余的食物最多可维持多少天 16 { 17 int sum=0; 18 for(int i=x;i <= 7;++i) 19 { 20 sum += d[i]; 21 if(sum == res+1)//第一次到res+1时,[x,i-1]都是可以维持的 22 return i-x; 23 } 24 } 25 int aWeek(int x,int a,int b,int c)//[x,7] 26 { 27 int ans=INF; 28 if(a-suma[x] < 0)//判断a能否顺利度过周[x,7] 29 ans=min(ans,Check(da,x,a)); 30 if(b-sumb[x] < 0)//判断b能否顺利度过周[x,7] 31 ans=min(ans,Check(db,x,b)); 32 if(c-sumc[x] < 0)//判断c能否顺利度过周[x,7] 33 ans=min(ans,Check(dc,x,c)); 34 return ans; 35 } 36 int F(int x,int a,int b,int c)//以周x为旅行的第一天 37 { 38 int ans=aWeek(x,a,b,c);//判断a,b,c能否顺利度过周[x,7] 39 if(ans != INF)//如果不能,输出ans 40 return ans; 41 ans=7-x+1;//如果可以顺利度过第一周的周[x,7] 42 a -= suma[x]; 43 b -= sumb[x]; 44 c -= sumc[x]; 45 int k=min(min(a/3,b/2),c/2);//最多可以维持的整周数 46 ans += k*7; 47 //不应该是a%=3,应该是 a -= 最少的周数*每周吃的个数; 48 a -= k*3; 49 b -= k*2; 50 c -= k*2; 51 ans += aWeek(1,a,b,c);//剩余的部分最多可维持下一周的天数 52 return ans; 53 } 54 int Solve(int a,int b,int c) 55 { 56 int ans=0; 57 for(int i=1;i <= 7;++i)//枚举周i为旅行的第一天 58 ans=max(ans,F(i,a,b,c)); 59 60 return ans; 61 } 62 int main() 63 { 64 // freopen("C:\\Users\\hyacinthLJP\\Desktop\\in&&out\\contest","r",stdin); 65 int a,b,c; 66 while(~scanf("%d%d%d",&a,&b,&c)) 67 printf("%d\n",Solve(a,b,c)); 68 69 return 0; 70 }