ZOJ 3757 Alice and Bob and Cue Sports(模擬題)

A - Alice and Bob and Cue Sports
Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu
Appoint description: 

Description

Alice and Bob both love playing games. Now, Alice and Bob are playing a cue sport like Nine-ball Pool. Two players move in turn. A move is that one player use the cue ball to hit the target ball for pocketing the target ball. At the beginning of game, there are one cue ball and n object balls. Each object ball has a number (a positive integer) on it, and no two object balls have the same number. In a move, the target ball is a object ball still on the table with the smallest number. If the player does the following things in a move, a foul is called and a penalty point is added to the opposite's point:

  • Cue ball do not hit any object ball. Penalty: the number of target ball.
  • Cue ball is not pocketed and hit at least one ball, but do not hit target ball first or hit more than one object ball first at the same time. Penalty: the largest number of ball in the first hit balls.
  • Cue ball is pocketed and hit at least one ball. Penalty: the largest number of ball in the first hit balls.
If the player pockets the target ball without a foul, a point will be added to the player's points, which is the sum of numbers of the ball pocketed in this move, and the player can make another move. But, if the player pockets the target ball with a foul or pockets at least one object ball not including the target ball, this point will be added to the opposite's points. If cue ball is pocketed, it will be pull out of the pocket and put on the table again while object balls will not be put on the table again after they are pocketed, even if the player pocketed them with a foul.

Now given n object balls and m moves, Bob wants to write a program to calculate the final points of Alice and him after these m moves. Because of Lady's first Rule, Alice always moves first.

Input

There are multiple cases. The first line of each case consists of two integers, n and m (1 ≤ n ≤ 1000, 0 ≤ m ≤ 1000), as described above. The second line consists of n positive integers. Each integer ai means the number of ith object ball (1 ≤ ai ≤ 10000). There are 2m lines followed. The (2i-1)th and (2i)th lines describe the ith move. The (2i-1)th line first includes an integer p, meaning cue ball hits p balls first. There are p integers followed in the same line, describing the hit balls. The (2i)th line first includes an integer q, meaning there are q balls pocketed. There are q integers followed in the same line, describing the pocketed balls (0 means cue ball). It's guaranteed that there is no impossible data.

Output

For each case, output one line as the format: "AP : BP", where AP means Alice's points and BP means Bob's points.

Sample Input

3 3
2 3 5
1 2
1 2
1 3
1 5
1 3
1 3

Sample Output

2 : 8

題意:打桌球,按規則罰分,尼瑪啊,模擬題就算了吧,還要是題意題,犯規之後除了罰那些分,還要罰全部進球的分啊,你妹啊

題解:就是一個大模擬題啊。。。尼瑪啊,浪費時間啊,題意原來都沒懂啊,可以不坑我嗎啊,看別人代碼才知道看錯題意啊

(僅以此文紀念浪費的時間和逝去的碼力和死去的腦細胞啊)


#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[1008],b[1008],c[1008],mark[1008],res[2];
int main()
{
    int n,m,i,j,k,now,x,y,temp,flag,flag2;

    while(~scanf("%d%d",&n,&m))
    {
        for(i=0; i<n; i++) scanf("%d",a+i);
        sort(a,a+n);
        res[0]=res[1]=0;

        for(now=k=0; k<m; k++)
        {
            scanf("%d",&x);
            for(i=0; i<x; i++) scanf("%d",b+i);

            scanf("%d",&y);
            for(i=0; i<y; i++) scanf("%d",c+i);

            flag2=0;
            if(!x)
            {
                res[!now]+=a[0];
            }
            else
            {
                for(flag=i=0; i<y; i++) if(c[i]==0)
                    {
                        flag=1;
                        break;
                    }
                if(flag)
                {
                    for(temp=i=0; i<x; i++) if(b[i]>temp) temp=b[i];
                    res[!now]+=temp;
                }
                else
                {
                    if(x>1)
                    {
                        for(temp=i=0; i<x; i++) if(b[i]>temp) temp=b[i];
                        res[!now]+=temp;
                    }
                    else
                    {
                        if(b[0]!=a[0])
                        {
                            for(temp=i=0; i<x; i++) if(b[i]>temp) temp=b[i];
                            res[!now]+=temp;
                        }
                        else
                        {
                            for(i=0; i<y; i++) if(c[i]==a[0])
                                {
                                    flag2=1;
                                    break;
                                }
                        }
                    }
                }
            }
            if(flag2)
            {
                for(i=0; i<y; i++) res[now]+=c[i];
            }
            else
            {
                now=!now;
                for(i=0; i<y; i++) res[now]+=c[i];
            }
            memset(mark,0,sizeof(mark));
            for(i=0; i<y; i++)
            {
                if(c[i]==0) continue;
                for(j=0; j<n; j++) if(a[j]==c[i])
                    {
                        mark[j]=1;
                        break;
                    }
            }
            for(i=j=0; i<n; i++)
            {
                if(mark[i]) continue;
                a[j++]=a[i];
            }
            n=j;
        }
        printf("%d : %d\n",res[0],res[1]);
    }

    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章