P1166题解

思路

花了半天去理解题意……意思是说给你一个选手的滚球情况,打出他当前的成绩。简单的说这题就是一个模拟(我才不是因为懒才找模拟题写的)思路也很简单,对每一轮进行以下几个判断就行啦:

  1. 首先判断有没有在两次滚球之内把 1010 个柱子滚完(判断有没有/)。
  2. 如果滚完了(有/),在下一轮或下下轮找可以加的得分(如果 33 次滚球机会没用完,就不能输出得分)。
  3. 如果没有滚完(没有/),判断当前轮有没有滚两次球(字符串长度是否为 22),没有的话同样不能输出成绩。

思路还是很清晰的,下面放上代码:

#include <iostream>
#include <algorithm>
using namespace std;
int ans[15];//记录本轮得分的数组
int ans1[15];//前缀和数组
int flag[15];//标识能否输出答案
string s[15];
int serch(int i){
	for(int j=0;j<s[i].size();j++)
	{
		if(s[i][j]=='/')
		return j+1;
	}
	return 0;
}//判断是否存在'/'
int getnum(int i,int len){
	int ans=0;
	int k=s[i].size();
	for(int j=0;j<min(k,len);j++){//防越界
		if(s[i][j]=='/')
		ans=10;
		else
		ans+=(s[i][j]-'0');
	}
	return ans;
}
int main(){
	int len=0;
	while(cin>>s[len++]);
	for(int i=0;i<10;i++){
		int k=3;
		if(s[i]=="")
		break;
		if(serch(i)){
			ans[i]+=10;
			k-=s[i].size();
			if(k>0){
				ans[i]+=getnum(i+1,k);
				k-=s[i+1].size();
			}//加上下次可以得到的分
			if(k>0){
				ans[i]+=getnum(i+2,k);
				k-=s[i+2].size();
			}//加上下下次可以得到的分
			if(k<=0)flag[i]=1;//可以输出的分
		}
		else{
			ans[i]=getnum(i,s[i].size());
			if(s[i].size()==2)
			flag[i]=1;
		}	
	}
	for(int i=0;i<10;i++){
		if(flag[i])
		cout<<ans[i]<<" ";
	} 
	cout<<endl;
	ans1[0]=ans[0];
	for(int i=1;i<10;i++)ans1[i]=ans1[i-1]+ans[i];
	for(int i=0;i<10;i++){
		if(flag[i])
		cout<<ans1[i]<<" ";
	}
	return 0;//完结撒花!!! 
}
posted @   KK_SpongeBob  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
点击右上角即可分享
微信分享提示