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