P1166题解
Marshall001 · · 题解
题目传送门
题目大意
这道题题目比较难理解,大致意思如下:
如果这一轮第一次滚球就全部击倒了,那么本轮得分为
如果这一轮滚球两次才全部击倒,那么本轮的得分为
如果两次滚球都没有全部击倒,那么本轮得分就为两次滚球得分的总和。
可是第
思路
题目了解清楚了,应该就有思路了吧?
没错,就是纯模拟!
枚举每一次的进球情况,然后再根据情况计算出每轮的得分,最后输出第
注意
这道题我卡了很久,最后发现有一句这样的话:
若某轮的得分暂时无法算出,则该轮得分不显示。
什么叫做得分暂时无法算出呢?就是比如说我第
那怎么解决呢?只需判断本轮,下一轮,下下一轮的输入是否合法,如果不合法,就可以直接跳出了。
代码
说了这么多了,上代码!
#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
}