P1166 打保龄球【洛谷算法习题】

张开发
2026/4/19 21:26:09 15 分钟阅读
P1166 打保龄球【洛谷算法习题】
P1166 打保龄球网页链接P1166 打保龄球题目描述打保龄球是用一个滚球去打击十个站立的柱将柱击倒。一局分十轮每轮可滚球一次或多次以击倒的柱数为依据计分。一局得分为十轮得分之和而每轮的得分不仅与本轮滚球情况有关还可能与后续一两轮的滚球情况有关。即某轮某次滚球击倒的柱数不仅要计入本轮得分还可能会计入前一两轮得分。具体的滚球击柱规则和计分方法如下若某一轮的第一次滚球就击倒全部十个柱则本轮不再滚球若是第十轮则还需另加两次滚球不妨称其为第十一轮和第十二轮并不是所有的情况都需要滚第十一轮和第十二轮球。该轮得分为本次击倒柱数10 1010与以后两次滚球所击倒柱数之和。若某一轮的第一次滚球未击倒十个柱则可对剩下未倒的柱再滚球一次。如果这两次滚球击倒全部十个柱则本轮不再滚球若是第十轮则还需另加一次滚球该轮得分为这两次共击倒柱数10 1010与以后一次滚球所击倒柱数之和。若某一轮两次滚球未击倒全部十个柱则本轮不再继续滚球该轮得分为这两次滚球击倒的柱数之和。总之若一轮中一次滚球或两次滚球击倒十个柱则本轮得分是本轮首次滚球开始的连续三次滚球击倒柱数之和其中有一次或两次不是本轮滚球。若一轮内二次滚球击倒柱数不足十个则本轮得分即为这两次击倒柱数之和。下面以实例说明如下(字符/表示击倒当前球道上的全部的柱)轮123456789101112击球情况///729/818//9//8/各轮得分302719918920202020累计总分30577685103112132152172192现在请你编写一个保龄球实时计分程序用来计算和显示某轮结束后的得分情况。若某轮的得分暂时无法算出则不显示该轮得分不输出。输入格式仅有一行为前若干轮滚球的情况每轮滚球用一到两个字符表示每一个字符表示一次击球字符/表示击倒当前球道上的全部的柱否则用一个数字字符表示本次滚球击倒的当前球道上的柱的数目两轮滚球之间用一个空格字符隔开。如上例对应的输入文件内容为/ / / 72 9/ 81 8/ / 9/ / 8/输出格式共两行第一行为每轮得分第二行为到当前轮为止的总得分。每个得分之间用一个空格隔开。输入输出样例 #1输入 #1/ / / 72 9/ 81 8/ / 9/ / 8/输出 #130 27 19 9 18 9 20 20 20 20 30 57 76 85 103 112 132 152 172 192解题思路本题核心是严格模拟保龄球计分规则完成击球解析、轮次计分与总分统计。首先将输入的字符串格式击球记录转换为击倒瓶数的数字序列/统一记为10。按照规则逐轮计算得分全中单球10分需累加后续两次击球分补中两球合计10分需累加后续一次击球分普通情况直接取两球和若后续击球数据不足则停止计算该轮及之后得分。最后统计每轮有效得分与累计总分按题目要求格式输出。算法全程线性遍历处理时间复杂度O ( n ) O(n)O(n)精准匹配所有计分规则与输出规范。总结核心逻辑解析击球记录按全中/补中/普通三种规则计算轮得分仅输出数据完整的有效得分。关键操作字符串转击球分数、遍历判断轮次类型、计算单轮得分与累计总分。效率保障线性遍历处理输入与计算无复杂逻辑完美适配题目计分与输出要求。代码内容#includebits/stdc.husingnamespacestd;typedeflonglongll;typedefunsignedlonglongull;typedefvectorvectorllvvt;typedefpairll,llpll;constll N1e310;constll p1e97;constll INF1e18;constll M1e610;intmain(){string s;getline(cin,s);vectorstringv;stringstreamss(s);string t;while(sst)v.push_back(t);vectorintr;for(conststringf:v){intpr0;for(size_t j0;jf.size();j){charchf[j];if(ch/){if(j0)r.push_back(10);elser.push_back(10-pr);}elseif(chX||ch:){r.push_back(10);}elseif(ch-){r.push_back(0);pr0;continue;}elseif(isdigit(ch)){intxch-0;r.push_back(x);prx;continue;}pr(ch/)?(10-pr):(ch-0);}}vectorintfs,c;inti0;intrd1;while(rd10i(int)r.size()){if(r[i]10){if(i2(int)r.size())break;intsc10r[i1]r[i2];fs.push_back(sc);i1;}else{if(i1(int)r.size())break;intfstr[i];intsndr[i1];if(fstsnd10){if(i2(int)r.size())break;intsc10r[i2];fs.push_back(sc);i2;}else{intscfstsnd;fs.push_back(sc);i2;}}rd;}intsm0;for(intx:fs){smx;c.push_back(sm);}if(!fs.empty()){for(size_t j0;jfs.size();j){if(j)cout ;coutfs[j];}cout\n;for(size_t j0;jc.size();j){if(j)cout ;coutc[j];}cout\n;}return0;}

更多文章