ZOJ 3757 Alice and Bob and Cue Sports(模拟)

题目链接

题意 : 玩台球。Alice 和 Bob,一共可以进行m次,Alice 先打。有一个白球和n个标有不同标号的球,称目标球为当前在桌子上的除了白球以外的数值最小的球,默认白球的标号为0。如果白球落入洞中,要把白球拿出来放在桌子上,如果是其他的球就不拿哪怕是犯规打进去的。每打一局(每一局代表每人打一杆)时当发生以下三种行为时算是犯规,会将相应的罚分加给对方,自己不减分。

  1. 白球没有打中任何球。将目标球的数值加到对方的分数上。
  2. 白球没有入洞且至少打中一个球,一开始没有打中目标球或者一开始同时打中不止一个球。就把一开始打中的球中数值最大的加到对方的分数上。
  3. 白球入洞且至少打中一个球。就把一开始打中的球中数值最大的加到对方的分数上。

如果没有犯规的话,就把洞里所有的球的数值总和加到自己的分数上。但如果是犯了规才把目标球打入洞中,或者是打入洞中的球没有目标球,上边这个数值总和就要再加给对方而不是自己。

思路 : 模拟了好几个小时没模拟出来。。。。。。。其实就是注意细节的问题,该怎么处理什么的。一开始没有把数值总和再加给对方,以为这个是在不犯规的情况下才加的,直接错了好几遍。。。。。。

  1 #include <iostream>

  2 #include <stdio.h>

  3 #include <string.h>

  4 #include <algorithm>

  5 

  6 using namespace std;

  7 

  8 int AP,BP;

  9 int ap[100010],aq[100010];

 10 int a[100010];

 11 int hashh[100010];

 12 

 13 int main()

 14 {

 15     int n,m;

 16     int p,q;

 17     while(scanf("%d %d",&n,&m)!=EOF)

 18     {

 19         AP = 0 ;

 20         BP = 0 ;

 21         memset(hashh,0,sizeof (hashh));

 22         for(int i = 1 ; i <= n ; i++)

 23             scanf("%d",&a[i]);

 24         sort(a+1 ,a+1+n);

 25         int k = 1 ;

 26         bool flag = false ;

 27         for(int i = 1 ; i <= m ; i++)

 28         {

 29             bool flag1 = 0 ,flag2 = 0 ;

 30             int maxx = -1 ;

 31             int sum = 0 ;

 32             scanf("%d",&p);

 33             while(hashh[a[k]])//找当前局的目标球

 34                 k++ ;

 35             for(int i = 1 ; i <= p ; i++)

 36             {

 37                 scanf("%d",&ap[i]);

 38                 maxx = max(maxx,ap[i]) ;

 39                 if(ap[i] == a[k] && p == 1 ) flag1 = 1 ; //只有目标球入洞

 40             }

 41             scanf("%d",&q);

 42             for(int i = 1 ; i <= q ; i++)

 43             {

 44                 scanf("%d",&aq[i]);

 45                 sum += aq[i];

 46                 hashh[aq[i]] ++ ;

 47                 if(aq[i] == 0 ) flag2 = 1 ;//cue球进洞了

 48             }

 49             if(!flag)

 50             {

 51                 if(p == 0)

 52                 {

 53                     flag = true ;

 54                     BP += a[k];

 55                 }

 56                 else if(flag2 == 0 && flag1 == 0 )

 57                 {

 58                     flag = true ;

 59                     BP += maxx ;

 60                     BP += sum ;

 61                 }

 62                 else if(flag2 && p)

 63                 {

 64                     flag = true ;

 65                     BP += maxx;

 66                     BP += sum;

 67                 }

 68                 else if(hashh[a[k]] == 0)

 69                 {

 70                     flag = true ;

 71                     BP += sum;

 72                 }

 73                 else

 74                     AP += sum;

 75             }

 76             else

 77             {

 78                 if(p == 0)

 79                 {

 80                     flag = false ;

 81                     AP += a[k];

 82                 }

 83                 else if(flag2 == 0 && flag1 == 0 )

 84                 {

 85                     flag = false ;

 86                     AP += maxx ;

 87                     AP += sum ;

 88                 }

 89                 else if(flag2 && p)

 90                 {

 91                     flag = false ;

 92                     AP += maxx;

 93                     AP += sum;

 94                 }

 95                 else if(hashh[a[k]] == 0)//目标球未进洞

 96                 {

 97                     flag = false ;

 98                     AP += sum;

 99                 }

100                 else

101                     BP += sum;

102             }

103         }

104         printf("%d : %d\n",AP,BP);

105     }

106     return 0;

107 }
View Code

 

你可能感兴趣的:(port)