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

 


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

 


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

 

posted @ 2019-04-19 10:07  HHHyacinth  阅读(127)  评论(0编辑  收藏  举报