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\n",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\n");
        else
        printf("illegal");
    }
    else if(f2)
    {
        if(a == b)
        printf("the second player won\n");
        else
        printf("illegal");
    }
    else if(a + b == 9)
    printf("draw\n");
    else if(a > b)
    printf("second\n");
    else if(a == b)
    printf("first\n");
    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("\n");
    return 0;
}
View Code
复制代码

 

posted @   Naix_x  阅读(137)  评论(0)    收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示