P1166题解

· · 题解

题目传送门

题目大意

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

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

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

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

可是第 10 轮和第 9 轮没有后两 () 轮怎么办?我们的第 11 轮和第 12 轮就要出场了!

思路

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

没错,就是纯模拟!

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

注意

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

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

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

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

代码

说了这么多了,上代码!

#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 
}