题解 P1148 【拱猪计分】
传送门:P1148
没啥好说的,就是一道模拟题,按照题意模拟就行。
但是题目里确实有些地方表述得不够清楚,那下面我来讲一下,给大家避避雷
1.关于全部WA的,这题貌似不支持动态输出,要先预存答案再输出
2.关于只AC第五个点的,这题正数前也要加符号,注意调整输出方式
3.关于只WA第二个点的,H牌拿满后若单独存在D11、S12牌也要扣分
4.H牌拿满只能加200分,不是加13*200分,由题目给的样例可知
5.这题数据太弱,我A了以后才发现有持满16张牌+1000分的条件233
Code:
#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
const int H[]={0,-50,-2,-3,-4,-5,-6,-7,-8,-9,-10,-20,-30,-40};
const int S12=-100;
const int D11=100;
int n,cntbr,cnttot;
vector<string> s;
struct node{
int a,b,c,d;
}sco[N];
int score(){
int ans=0;
int cntH=0,cntC10=0;
int cntS12=0,cntD11=0;
int bothS12D11=0;
for(int i=0;i<s.size();i++){
if(s[i][0]=='H')cntH++;
if(s[i][0]=='C'&&s[i][1]=='1'&&s[i][2]=='0')cntC10++;
if(s[i][0]=='S'&&s[i][1]=='1'&&s[i][2]=='2')cntS12++;
if(s[i][0]=='D'&&s[i][1]=='1'&&s[i][2]=='1')cntD11++;
if(cntD11&&cntS12)bothS12D11++;
}
if(cntH==13&&!bothS12D11)ans+=200;
else if(cntH==13&&bothS12D11)ans+=500;
if(s.size()==1&&cntC10)ans+=50;
if(cntS12&&!bothS12D11)ans+=S12;
if(cntD11&&!bothS12D11)ans+=D11;
if(cntH<13){
for(int i=0;i<s.size();i++){
if(s[i][0]=='H'&&s[i][1]=='1'&&s[i].size()==2)ans+=H[1];
if(s[i][0]=='H'&&s[i][1]=='2'&&s[i].size()==2)ans+=H[2];
if(s[i][0]=='H'&&s[i][1]=='3'&&s[i].size()==2)ans+=H[3];
if(s[i][0]=='H'&&s[i][1]=='4'&&s[i].size()==2)ans+=H[4];
if(s[i][0]=='H'&&s[i][1]=='5'&&s[i].size()==2)ans+=H[5];
if(s[i][0]=='H'&&s[i][1]=='6'&&s[i].size()==2)ans+=H[6];
if(s[i][0]=='H'&&s[i][1]=='7'&&s[i].size()==2)ans+=H[7];
if(s[i][0]=='H'&&s[i][1]=='8'&&s[i].size()==2)ans+=H[8];
if(s[i][0]=='H'&&s[i][1]=='9'&&s[i].size()==2)ans+=H[9];
if(s[i][0]=='H'&&s[i][1]=='1'&&s[i][2]=='0'&&s[i].size()==3)ans+=H[10];
if(s[i][0]=='H'&&s[i][1]=='1'&&s[i][2]=='1'&&s[i].size()==3)ans+=H[11];
if(s[i][0]=='H'&&s[i][1]=='1'&&s[i][2]=='2'&&s[i].size()==3)ans+=H[12];
if(s[i][0]=='H'&&s[i][1]=='1'&&s[i][2]=='3'&&s[i].size()==3)ans+=H[13];
}
}
if(s.size()>1&&cntC10)ans<<=1;
return ans;
}
int main(){
while(1){
cntbr=0;cnttot++;
for(int i=1;i<=4;i++){
s.clear();cin>>n;
if(n==0)cntbr++;
for(int j=1;j<=n;j++){
string str;
cin>>str;
s.push_back(str);
}
if(i==1)sco[cnttot].a=score();
if(i==2)sco[cnttot].b=score();
if(i==3)sco[cnttot].c=score();
if(i==4)sco[cnttot].d=score();
}
if(cntbr==4)break;
}
for(int i=1;i<cnttot;i++){
if(sco[i].a>0)printf("+%d ",sco[i].a);
if(sco[i].a<=0)printf("%d ",sco[i].a);
if(sco[i].b>0)printf("+%d ",sco[i].b);
if(sco[i].b<=0)printf("%d ",sco[i].b);
if(sco[i].c>0)printf("+%d ",sco[i].c);
if(sco[i].c<=0)printf("%d ",sco[i].c);
if(sco[i].d>0)printf("+%d ",sco[i].d);
if(sco[i].d<=0)printf("%d ",sco[i].d);
puts("");
}
return 0;
}