洛谷P1166 打保龄球(模拟)
题目描述
打保龄球是用一个滚球去打击十个站立的柱,将柱击倒。一局分十轮,每轮可滚球一次或多次,以击倒的柱数为依据计分。一局得分为十轮得分之和,而每轮的得分不仅与本轮滚球情况有关,还可能与后续一两轮的滚球情况有关。即某轮某次滚球击倒的柱数不仅要计入本轮得分,还可能会计入前一两轮得分。具体的滚球击柱规则和计分方法如下:
(1)若某一轮的第一次滚球就击倒全部十个柱,则本轮不再滚球(若是第十轮则还需另加两次滚球,不妨称其为第十一轮和第十二轮,并不是所有的情况都需要滚第十一轮和第十二轮球)。该轮得分为本次击倒柱数10与以后两次滚球所击倒柱数之和。
(2)若某一轮的第一次滚球未击倒十个柱,则可对剩下未倒的柱再滚球一次。如果这两次滚球击倒全部十个柱,则本轮不再滚球(若是第十轮则还需另加一次滚球),该轮得分为这两次共击倒柱数101010与以后一次滚球所击倒柱数之和。
(3)若某一轮两次滚球未击倒全部十个柱,则本轮不再继续滚球,该轮得分为这两次滚球击倒的柱数之和。
总之,若―轮中一次滚球或两次滚球击倒十个柱,则本轮得分是本轮首次滚球开始的连续三次滚球击倒柱数之和(其中有一次或两次不是本轮滚球)。若一轮内二次滚球击倒柱数不足十个,则本轮得分即为这两次击倒柱数之和。下面以实例说明如下(字符“/”表示击倒当前球道上的全部的柱):
轮 1 2 3 4 5 6 7 8 9 10 11 12
击球情况 / / / 72 9/ 81 8/ / 9/ / 8/
各轮得分 30 27 19 9 18 9 20 20 20 20
累计总分 30 57 76 85 103 112 132 152 172 192
现在请你编写一个保龄球实时计分程序,用来计算和显示某轮结束后的得分情况。若某轮的得分暂时无法算出,则该轮得分不显示。
输入格式
仅有一行,为前若干轮滚球的情况,每轮滚球用一到两个字符表示,每一个字符表示一次击球,字符“/”表示击倒当前球道上的全部的柱,否则用一个数字字符表示本次滚球击倒的当前球道上的柱的数目,两轮滚球之间用一个空格字符隔开。
如上例对应的输入文件内容为:/ / / 72 9/ 81 8/ / 9/ / 8/
输出格式
共两行,第一行为每轮得分,第二行为到当前轮为止的总得分。每个得分之间用一个空格隔开。
输入输出样例
输入 #1
/ / / 72 9/ 81 8/ / 9/ / 8/
输出 #1
30 27 19 9 18 9 20 20 20 20
30 57 76 85 103 112 132 152 172 19
花了半天去理解题意…意思是说给你一个选手的滚球情况,打出他当前的成绩(坑了我不知道多少发 )
简单的说这题就是一个模拟(我才不是因为懒才找模拟题写的 )思路也很简单,对每一轮进行以下几个判断就行啦:
- 首先判断有没有在两次滚球之内把十个柱子滚完(判断有没有’/’);
- 如果滚完了(有’/’),在下一轮或下下轮找可以加的得分(如果三次滚球机会没用完,就不能输出得分);
- 如果没有滚完(没有’/’),判断当前轮有没有滚两次球(字符串长度是否为2),没有的话同样不能输出成绩.
思路还是很清晰的,下面放上代码
ACCODE
#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;elseans+=(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;
}
洛谷P1166 打保龄球(模拟)相关推荐
- 洛谷 P1166 打保龄球
P1166 打保龄球 题目描述 打保龄球是用一个滚球去打击十个站立的柱,将柱击倒.一局分十轮,每轮可滚球一次或多次,以击倒的柱数为依据计分.一局得分为十轮得分之和,而每轮的得分不仅与本轮滚球情况有关, ...
- 洛谷 10月 csp-s 模拟赛 T1,T2解析及代码
洛谷 10月 csp-s 模拟赛 T1,T2解析及代码 T1 Magenta Potion 题目描述 给定一个长为 nnn 的整数序列 aaa,其中所有数的绝对值均大于等于 222.有 qqq 次操作 ...
- 洛谷P1088.火星人【模拟/搜索/康托展开】
洛谷P1088.火星人[模拟/搜索/康托展开] 题干 题目描述 输入格式 输出格式 输入输出样例 说明/提示 题意 思路一--模拟 分析 上代码 思路二--搜索 分析 上代码 思路三--变进制数与康托 ...
- 洛谷CSP-J/S2020初赛模拟部分题解
说明 试题来源于洛谷CSP-J/S2020初赛模拟试题. 选择题 T1. 十进制数114的相反数的8位二进制补码是:(10001110) [解析]整数的二进制表示的最高位为符号位,用0表示" ...
- 洛谷P1667/[10.22 模拟赛] 数列 (思维+模拟)
洛谷P1667 数列 题目描述 给定一个长度是n的数列A,我们称一个数列是完美的,当且仅当对于其任意连续子序列的和都是正的.现在你有一个操作可以改变数列,选择一个区间[X,Y]满足\(A_X +A_{ ...
- 洛谷 P1413 坚果保龄球
P1413 坚果保龄球 题目描述 PVZ这款游戏中,有一种坚果保龄球.zombie从地图右侧不断出现,向左走,玩家需要从左侧滚动坚果来碾死他们. 我们可以认为地图是一个行数为6,列数为60的棋盘.zo ...
- 洛谷 P2689 东南西北【模拟/搜索】
题目描述 给出起点和终点的坐标及接下来T个时刻的风向(东南西北),每次可以选择顺风偏移1个单位或者停在原地.求到达终点的最少时间. 如果无法偏移至终点,输出"-1". 输入输出格式 ...
- 洛谷 1563 玩具谜题——模拟水题
题目:https://www.luogu.org/problemnew/show/P1563 模拟水题. #include<iostream> #include<cstdio> ...
- 洛谷:坚果保龄球(P1413,贪心)
PVZ这款游戏中,有一种坚果保龄球.zombie从地图右侧不断出现,向左走,玩家需要从左侧滚动坚果来碾死他们. 我们可以认为地图是一个行数为6,列数为60的棋盘.zombie出现的那一秒站在这一行的第 ...
最新文章
- pch在c语言中占内存字节数,2018年9月计算机二级C语言考试章节习题及答案(6).docx...
- java params 参数_将params作为参数传递给类扩展方法的函数
- html表格中添加修改和删除链接,jQuery实现为table表格动态添加或删除tr功能示例...
- elementui表格-改变某一列的样式
- IE 7 Standard 模式问题总结
- 一个七年程序员的经验
- 条件随机场python实现_基于条件随机场的多标签分类
- android快速点击分析
- java能否回文_如何使用Java查找字符串是否是回文?
- C语言客户端窗口创建,【自己动手】用C语言写一个基于服务器和客户端!
- 你碰到过的最难调的 Bug 是什么?
- C++中#includeXXX.h和#includeXXX.h的区别
- Unity利用GPUinstancing实现大面积草地
- Ribbon界面开发(C++)
- Windows组策略
- CUDA的旋转R ROI Align的OPENCL实现1(原理理解)
- T100——错误信息提示传入参数显示
- (一)WLAN定义和基本架构
- openshift operator 介绍
- 怎么查看计算机簇大小,分区格式与簇的大小讲解