zoukankan      html  css  js  c++  java
  • Codeforces Round #274 (Div. 2) 解题报告

    题目地址:http://codeforces.com/contest/479

    这次自己又仅仅能做出4道题来。

    A题:Expression

    水题。

    枚举六种情况求最大值就可以。

    代码例如以下:

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <stdlib.h>
    #include <math.h>
    #include <ctype.h>
    #include <queue>
    #include <map>
    #include <set>
    #include <algorithm>
    
    using namespace std;
    #define LL __int64
    int main()
    {
        LL a, b, c, d[10];
        while(scanf("%I64d%I64d%I64d",&a,&b,&c)!=EOF)
        {
            d[0]=a*b*c;
            d[1]=(a+b)*c;
            d[2]=a+b+c;
            d[3]=a*(b+c);
            d[4]=a+b*c;
            d[5]=a*b+c;
            sort(d,d+6);
            printf("%I64d
    ",d[5]);
        }
        return 0;
    }

    B题:Towers

    水题。

    每次都是将最多的拿出一个给最少的,直到最大的与最少的相差小于或等于1.

    代码例如以下:

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <stdlib.h>
    #include <math.h>
    #include <ctype.h>
    #include <queue>
    #include <map>
    #include <set>
    #include <algorithm>
    
    using namespace std;
    #define LL __int64
    struct node
    {
        int x, num;
    }fei[1000];
    int cmp(node x, node y)
    {
        return x.x<y.x;
    }
    int a[2000], b[2000];
    int main()
    {
        int n, m, i, j, cnt, ans;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            for(i=0;i<n;i++)
            {
                scanf("%d",&fei[i].x);
                fei[i].num=i;
            }
            cnt=0;
            while(m--)
            {
                sort(fei,fei+n,cmp);
                if(fei[n-1].x-fei[0].x<=1) break;
                a[cnt]=fei[n-1].num;
                b[cnt++]=fei[0].num;
                fei[n-1].x--;
                fei[0].x++;
            }
            sort(fei,fei+n,cmp);
            printf("%d %d
    ",fei[n-1].x-fei[0].x, cnt);
            for(i=0;i<cnt;i++)
            {
                printf("%d %d
    ",a[i]+1,b[i]+1);
            }
        }
        return 0;
    }

    C题:Exams

    还是水。。小贪心

    小贪心。先按标记日期排个序,然后扫一遍就可以,能用小的就优先考虑小的。

    代码例如以下:

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <stdlib.h>
    #include <math.h>
    #include <ctype.h>
    #include <queue>
    #include <map>
    #include <set>
    #include <algorithm>
    
    using namespace std;
    #define LL __int64
    struct node
    {
        int x, y;
    }fei[6000];
    int cmp(node x, node y)
    {
        if(x.x==y.x)
            return x.y<y.y;
        return x.x<y.x;
    }
    int main()
    {
        int n, i, j, ans, k, x1, x2;
        while(scanf("%d",&n)!=EOF)
        {
            for(i=0;i<n;i++)
            {
                scanf("%d%d",&fei[i].x,&fei[i].y);
            }
            sort(fei,fei+n,cmp);
            k=1;
            for(i=0;i<n;i++)
            {
                if(fei[i].y>=k)
                {
                    k=fei[i].y;
                }
                else
                {
                    k=fei[i].x;
                }
            }
            printf("%d
    ",k);
        }
        return 0;
    }

    D题:

    还是水。。。

    二分。

    分别考虑4种情况,x,y,x+y,y-x。然后用二分找差值为这四个数的。

    代码例如以下:

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <stdlib.h>
    #include <math.h>
    #include <ctype.h>
    #include <queue>
    #include <map>
    #include <set>
    #include <algorithm>
    
    using namespace std;
    #define LL __int64
    int a[110000];
    int bin_search(int x, int y, int high)
    {
        int low=0, mid;
        while(low<=high)
        {
            mid=low+high>>1;
            if(y-a[mid]==x) return 1;
            else if(y-a[mid]>x) low=mid+1;
            else high=mid-1;
        }
        return 0;
    }
    int main()
    {
        int n, l, x, y, i, j, k, flag1, flag2;
        while(scanf("%d%d%d%d",&n,&l,&x,&y)!=EOF)
        {
            flag1=flag2=0;
            for(i=0; i<n; i++)
            {
                scanf("%d",&a[i]);
                if(a[i]==x)
                    flag1=1;
                if(a[i]==y)
                    flag2=1;
            }
            if(flag1&&flag2)
            {
                printf("0
    ");
            }
            else
            {
                flag1=flag2=0;
                for(i=1;i<n;i++)
                {
                    if(bin_search(x,a[i],i-1))
                    {
                        flag1=1;
                        break;
                    }
                }
                for(i=1;i<n;i++)
                {
                    if(bin_search(y,a[i],i-1))
                    {
                        flag2=1;
                    }
                }
                if(flag1&&flag2)
                {
                    printf("0
    ");
                }
                else if(flag1) printf("1
    %d
    ",y);
                else if(flag2) printf("1
    %d
    ",x);
                else
                {
                    int flag=0;
                    for(i=1;i<n;i++)
                    {
                        if(bin_search(y+x,a[i],i-1))
                        {
                            flag=1;
                            break;
                        }
                    }
                    if(flag)
                    {
                        printf("1
    %d
    ",a[i]-x);
                    }
                    else
                    {
                        flag=0;
                        for(i=1;i<n;i++)
                        {
                            if(bin_search(y-x,a[i],i-1)&&(a[i]-y>=0||a[i]+x<=l))
                            {
                                flag=1;
                                break;
                            }
                        }
                        if(flag&&a[i]-y>=0)
                        {
                            printf("1
    %d
    ",a[i]-y);
                        }
                        else if(flag&&a[i]+x<=l)
                        {
                            printf("1
    %d
    ",a[i]+x);
                        }
                        else
                        {
                            printf("2
    %d %d
    ",x,y);
                        }
                    }
                }
            }
        }
        return 0;
    }
    



  • 相关阅读:
    显示文件本地文件夹
    Select Dependencies选择依赖项
    搜索小技巧
    783. Minimum Distance Between BST Nodes BST节点之间的最小距离
    5. Longest Palindromic Substring 最长的回文子串
    12. Integer to Roman 整数转罗马数字
    3. Longest Substring Without Repeating Characters 最长的子串不重复字符
    539. Minimum Time Difference 最小时差
    43. Multiply Strings 字符串相乘
    445. Add Two Numbers II 两个数字相加2
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/6913195.html
Copyright © 2011-2022 走看看