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



  • 相关阅读:
    Oracle数据库用户密码设为无限期
    CentOS 7设置网卡开机自动启用
    求凹多边形的视觉中心,不是质心、重心
    autocad数据交换格式dxf读取
    gis资源站
    geotools的空间索引使用——R树和四叉树
    JTS的泰森多边形
    Geotools的delaunry三角剖分
    geotools的最短路径实现
    java多线程
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/6913195.html
Copyright © 2020-2023  润新知