1 条题解

  • 0
    @ 2025-8-24 21:21:31

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Diaоsi
    Enemy of God

    搬运于2025-08-24 21:21:30,当前版本为作者最后更新于2019-10-31 19:23:08,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    传送门: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;
    }
    
    • 1

    信息

    ID
    150
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    1
    已通过
    1
    上传者