首页 > 代码库 > ZOJ 3757 Alice and Bob and Cue Sports(模拟)

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