P1166题解
思路
花了半天去理解题意……意思是说给你一个选手的滚球情况,打出他当前的成绩。简单的说这题就是一个模拟(我才不是因为懒才找模拟题写的)思路也很简单,对每一轮进行以下几个判断就行啦:
- 首先判断有没有在两次滚球之内把
个柱子滚完(判断有没有/
)。 - 如果滚完了(有
/
),在下一轮或下下轮找可以加的得分(如果 次滚球机会没用完,就不能输出得分)。 - 如果没有滚完(没有
/
),判断当前轮有没有滚两次球(字符串长度是否为 ),没有的话同样不能输出成绩。
思路还是很清晰的,下面放上代码:
#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;//完结撒花!!!
}
本人(KK_SpongeBob)蒟蒻,写不出好文章,但转载请注明原文链接:https://www.cnblogs.com/OIer-QAQ/p/18575287
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期