1 条题解

  • 0
    @ 2023-2-7 13:48:23

    题目传送门 原题解传送门

    题目大意

    这道题题目比较难理解,大致意思如下:

    如果这一轮第一次滚球就全部击倒了,那么本轮得分为 1010 加上后两次滚球的得分(注意!不是后两轮的得分!)为什么呢?当然是保龄球的规定啦!

    如果这一轮滚球两次才全部击倒,那么本轮的得分为 1010 加上后一次滚球的得分。

    如果两次滚球都没有全部击倒,那么本轮得分就为两次滚球得分的总和。

    可是第 1010 轮和第 99 轮没有后两 (()) 轮怎么办?我们的第 1111 轮和第 1212 轮就要出场了!

    思路

    题目了解清楚了,应该就有思路了吧?

    没错,就是纯模拟!

    枚举每一次的进球情况,然后再根据情况计算出每轮的得分,最后输出第 ii 场的得分情况和前 ii 场总共的得分就可以了。

    注意

    这道题我卡了很久,最后发现有一句这样的话:

    若某轮的得分暂时无法算出,则该轮得分不显示。

    什么叫做得分暂时无法算出呢?就是比如说我第 1010 轮第一次就进了,我需要知道第 1111 轮和第 1212 轮的滚球情况,才可以算出我第 1010 轮的得分,可是样例中没有给出第 1111 轮和第 1212 轮的滚球情况。这就叫做暂时无法算出。

    那怎么解决呢?只需判断本轮,下一轮,下下一轮的输入是否合法,如果不合法,就可以直接跳出了。

    代码

    说了这么多了,上代码!

    #include <iostream>
    using namespace std;
    string a[20];
    long long ans[20];//记录前缀和 
    long long answer(string x){//判断本场得分 
    	if(x==""){
    		return -1e9;//如果不符合,就让得分变成负数
    	}
    	if(x=="/"){//如果第一次就全部击倒 
    		return 10;//那么本场得分为 10 分 
    	}
    	else if(x.size()==1){//如果本场击球次数为一次且没有全部击倒 
    		return int(x[0]-'0');//那么本场得分为本场击倒保龄球的个数 
    	}
    	else if(x[1]=='/'){//如果第二次全部击倒 
    		return 10;//那么本场得分还是 10 分 
    	}
    	else{//否则两次都没有全部击倒 
    		return int(x[0]-'0')+int(x[1]-'0');//本场得分为两次总共得分 
    	}
    }
    int main(){
    	int cur=1;//表示现在在输入地几轮得分情况 
    	while(cin>>a[cur]){//循环输入 
    		cur++;
    	}
    	cur--;
    	for(int i=1;i<=10;i++){
    		if(a[i].size()==1&&a[i][0]!='/'){
    			break;
    		}
    		long long sum=0;//记录本轮得分 
    		if(a[i]=="/"){//如果本轮全部击倒 
    			sum+=10;//那么本场得分为 10 + 
    			sum+=answer(a[i+1]);//下一轮得分 
    			if(a[i+1].size()==1){//如果下一轮只滚了一次球 
    				string s1="";
    				s1+=a[i+2][0]; 
    				sum+=answer(s1);//那么本轮得分再加上下一次滚球的得分 
    			}
    		}
    		else if(a[i][1]=='/'){//如果本轮第二次全部击倒 
    			sum+=10;//那么本轮得分为 10 + 
    			string s2="";
    			s2+=a[i+1][0];
    			sum+=answer(s2);//下一次滚球的得分 
    		}
    		else{
    			sum+=answer(a[i]);//否则本轮得分为两次滚球的和 
    		}
    		if(sum<=0){
    			break;
    		}
    		cout<<sum<<" ";//输出本轮得分 
    		ans[i]=ans[i-1]+sum;//记录前缀和 
    	}
    	cout<<endl;//记得输出换行! 
    	for(int i=1;i<=10;i++){
    		if(ans[i]<=0){
    			continue;
    		}
    		cout<<ans[i]<<" ";//输出前缀和 
    	}
    	return 0;//THE END 
    }
    
    • 1

    信息

    ID
    34
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    3
    已通过
    0
    上传者