zoukankan      html  css  js  c++  java
  • Codeforces Beta Round #3

    A题,水题,还是无法1Y.

    B题,题意是类似背包的问题,在v的容量下,有1重量和2重量的,如果达到价值最大。

    贪心,写的很恶心。看着数据过了。

    奇数的时候,先选一个1。之后然后1+1 和 2 比较就行了。

    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <cmath>
    #include <cstdlib>
    #include <ctime>
    #include <algorithm>
    #include <iostream>
    using namespace std;
    #define eps 1e-10
    int flag[100001];
    struct node
    {
        int t,p,id;
    } s[100001];
    int cmp(node a,node b)
    {
        if(a.t == b.t)
            return a.p > b.p;
        else
            return a.t < b.t;
    }
    int main()
    {
        int i,n,v,s1,s2,e1,e2,sum,ans;
        scanf("%d%d",&n,&v);
        for(i = 0; i < n; i ++)
        {
            scanf("%d%d",&s[i].t,&s[i].p);
            s[i].id = i;
        }
        sort(s,s+n,cmp);
        sum = 0;
        for(i = 0; i < n; i ++)
        {
            if(s[i].t == 2) break;
        }
        if(v%2 == 1&&i > 0)
        {
            sum = 1;
            ans = s[0].p;
            s1 = 1;
            e1 = i-1;
            flag[s[0].id] = 1;
        }
        else
        {
            sum = 0;
            ans = 0;
            s1 = 0;
            e1 = i-1;
        }
        s2 = i;
        e2 = n-1;
        for(;;)
        {
            if(sum == v) break;
            if(s1 > e1&&s2 > e2) break;
            if(s1 > e1)
            {
                if(sum + 2 > v) break;
                else
                {
                    flag[s[s2].id] = 1;
                    sum += 2;
                    ans += s[s2].p;
                    s2 ++;
                }
            }
            else if(s2 > e2)
            {
                flag[s[s1].id] = 1;
                sum ++;
                ans += s[s1].p;
                s1 ++;
            }
            else
            {
                if(sum + 2 > v)
                {
                    flag[s[s1].id] = 1;
                    sum ++;
                    ans += s[s1].p;
                    s1 ++;
                }
                else
                {
                    if(s1 + 1 <= e1)
                    {
                        if(s[s1].p + s[s1+1].p > s[s2].p)
                        {
                            flag[s[s1].id] = 1;
                            flag[s[s1+1].id] = 1;
                            sum += 2;
                            ans += s[s1].p + s[s1+1].p;
                            s1 += 2;
                        }
                        else
                        {
                            flag[s[s2].id] = 1;
                            sum += 2;
                            ans += s[s2].p;
                            s2 ++;
                        }
                    }
                    else
                    {
                        if(s[s1].p  > s[s2].p)
                        {
                            flag[s[s1].id] = 1;
                            sum += 1;
                            ans += s[s1].p;
                            s1 += 1;
                        }
                        else
                        {
                            flag[s[s2].id] = 1;
                            sum += 2;
                            ans += s[s2].p;
                            s2 ++;
                        }
                    }
                }
            }
        }
        printf("%d
    ",ans);
        for(i = 0;i < n;i ++)
        {
            if(flag[i])
            printf("%d ",i+1);
        }
        return 0;
    }
    View Code

    C题,错了,好多次,胜利的时候,保证胜利一方走最后一步,注意非法的判断,最后,认真检查代码。。

    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <cmath>
    #include <cstdlib>
    #include <ctime>
    #include <algorithm>
    #include <iostream>
    using namespace std;
    char str[10][10];
    int judge(char s)
    {
        int i;
        for(i = 0;i < 3;i ++)
        {
            if(str[i][0] == s&&str[i][1] == s &&str[i][2] == s)
            return 1;
        }
        for(i = 0;i < 3;i ++)
        {
            if(str[0][i] == s&&str[1][i] == s &&str[2][i] == s)
            return 1;
        }
        if(str[0][0] == s&&str[1][1] == s&&str[2][2] == s)
        return 1;
        if(str[0][2] == s&&str[1][1] == s&&str[2][0] == s)
        return 1;
        return 0;
    }
    int main()
    {
        int i,a,b,j,f1,f2;
        for(i = 0;i < 3;i ++)
        scanf("%s",str[i]);
        a = b = 0;
        for(i = 0;i < 3;i ++)
        {
            for(j = 0;j < 3;j ++)
            {
                if(str[i][j] == '0')
                b ++;
                else if(str[i][j] == 'X')
                a ++;
            }
        }
        f1 = f2 = 0;
        if(a - b > 1||b > a)
        {
            printf("illegal");
            return 0;
        }
        f1 = judge('X');
        f2 = judge('0');
        if(f1&&f2)
        printf("illegal");
        else if(f1)
        {
            if(a > b)
            printf("the first player won
    ");
            else
            printf("illegal");
        }
        else if(f2)
        {
            if(a == b)
            printf("the second player won
    ");
            else
            printf("illegal");
        }
        else if(a + b == 9)
        printf("draw
    ");
        else if(a > b)
        printf("second
    ");
        else if(a == b)
        printf("first
    ");
        return 0;
    }
    View Code

    D题,神贪心题,题意很简单。

    又是,看的题解。。。先把?当做右括号来处理,将b[i]-a[i]放入优先队列(大顶堆)里,然后如果出现括号不匹配,判断堆里是否有元素,将堆定 变成(,顺便记录一下路径。

    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <cmath>
    #include <cstdlib>
    #include <ctime>
    #include <queue>
    #include <vector>
    #include <algorithm>
    #include <iostream>
    using namespace std;
    char str[100000];
    int a[100000];
    int b[100000];
    int s[100000];
    struct node
    {
        int w,id;
    };
    struct cmp
    {
        bool operator ()(const node &a,const node b)
        {
            return a.w < b.w;
        }
    };
    int main()
    {
        int i,len,flag,num;
        long long ans;
        cin>>str;
        len = strlen(str);
        priority_queue<node,vector<node>,cmp> que;
        flag = 0;
        num = 0;
        ans = 0;
        for(i = 0;i < len;i ++)
        {
            if(str[i] == '(')
               flag ++;
            else if(str[i] == ')')
               flag --;
            else
            {
                flag -- ;
                scanf("%d%d",&a[num],&b[num]);
                node temp;
                temp.w = b[num] - a[num];
                ans += b[num];
                s[num] = 1;
                temp.id = num;
                que.push(temp);
                num ++;
            }
            if(flag < 0)
            {
                if(que.empty()) break;
                else
                {
                    flag += 2;
                    node temp;
                    temp = que.top();
                    s[temp.id] = 0;
                    que.pop();
                    ans -= temp.w;
                }
            }
        }
        if(flag == 0)
        cout<<ans<<endl;
        else
        {
            cout<<"-1"<<endl;
            return 0;
        }
        num = 0;
        for(i = 0;i < len;i ++)
        {
            if(str[i] == '?')
            {
                if(s[num])
                cout<<")";
                else
                cout<<"(";
                num ++;
            }
            else
            cout<<str[i];
        }
        printf("
    ");
        return 0;
    }
    View Code
  • 相关阅读:
    java中常量定义在interface中好还是定义在class中
    CharacterEncodingFilter-Spring字符编码过滤器
    Integer判断相等,到底该用==还是equals
    ThreadLocal实现session中用户信息 的线程间共享
    分布式部署引发的问题
    分布式部署
    LogBack通过MDC实现日志记录区分用户Session
    Fragment 简介 基础知识 总结 MD
    直播 相关技术文章 相关调研文章
    直播 背景 技术体系 乐视云直播Demo
  • 原文地址:https://www.cnblogs.com/naix-x/p/3669046.html
Copyright © 2011-2022 走看看