zoukankan      html  css  js  c++  java
  • 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
    ",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
    ",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
    ",Solve(a,b,c));
    68 
    69     return 0;
    70 }
    View Code
  • 相关阅读:
    Go 函数方法
    rz上传文件乱码
    pip问题:ImportError: cannot import name main
    docker启动报错 docker: Error response from daemon: OCI runtime create failed: container_linux.go:348
    python遍历列表删除多个元素的坑
    python写入csv文件时的乱码问题
    python中的exec()函数和eval()函数
    tornado的IOLoop.instance()方法和IOLoop.current()方法区别
    安装mysql-python时报错
    python将科学计数法表示的数值的字符串转换成数值型数据
  • 原文地址:https://www.cnblogs.com/violet-acmer/p/10734199.html
Copyright © 2011-2022 走看看