首页 > 代码库 > ZOJ 3757 Alice and Bob and Cue Sports(模拟)
ZOJ 3757 Alice and Bob and Cue Sports(模拟)
题目链接
题意 : 玩台球。Alice 和 Bob,一共可以进行m次,Alice 先打。有一个白球和n个标有不同标号的球,称目标球为当前在桌子上的除了白球以外的数值最小的球,默认白球的标号为0。如果白球落入洞中,要把白球拿出来放在桌子上,如果是其他的球就不拿哪怕是犯规打进去的。每打一局(每一局代表每人打一杆)时当发生以下三种行为时算是犯规,会将相应的罚分加给对方,自己不减分。
- 白球没有打中任何球。将目标球的数值加到对方的分数上。
- 白球没有入洞且至少打中一个球,一开始没有打中目标球或者一开始同时打中不止一个球。就把一开始打中的球中数值最大的加到对方的分数上。
- 白球入洞且至少打中一个球。就把一开始打中的球中数值最大的加到对方的分数上。
如果没有犯规的话,就把洞里所有的球的数值总和加到自己的分数上。但如果是犯了规才把目标球打入洞中,或者是打入洞中的球没有目标球,上边这个数值总和就要再加给对方而不是自己。
思路 : 模拟了好几个小时没模拟出来。。。。。。。其实就是注意细节的问题,该怎么处理什么的。一开始没有把数值总和再加给对方,以为这个是在不犯规的情况下才加的,直接错了好几遍。。。。。。
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 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。