题意 : 玩台球。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 }
时间: 2024-10-07 05:06:27