7-1 h0094. 乒乓球
分数 12
全屏浏览题目切换布局
作者 黄正鹏
单位 贵州工程应用技术学院
国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。
其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。
华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白11分制和21分制对选手的不同影响。
在开展他的研究之前,他首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙。
华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在11分制和21分制下,双方的比赛结果(截至记录末尾)。
比如现在有这么一份记录,(其中W表示华华获得一分,L表示华华对手获得一分):
WWWWWWWWWWWWWWWWWWWWWWLW
在11分制下,此时比赛的结果是华华第一局11比0获胜,第二局11比0获胜,正在进行第三局,当前比分1比1。
而在21分制下,此时比赛结果是华华第一局21比0获胜,正在进行第二局,比分2比1。
如果一局比赛刚开始,则此时比分为0比0。
你的程序就是要对于一系列比赛信息的输入(WL形式),输出正确的结果。
输入格式:
每个输入文件包含若干行字符串(每行至多20个字母),字符串由大写的W、L和E组成。
其中E表示比赛信息结束,程序应该忽略E之后的所有内容。
输出格式:
输出由两部分组成,每部分有若干行,每一行对应一局比赛的比分(按比赛信息输入顺序)。
其中第一部分是11分制下的结果,第二部分是21分制下的结果,两部分之间由一个空行分隔。
输入样例:
WWWWWWWWWWWWWWWWWWWW WWLWE
输出样例:
11:0 11:0 1:1 21:0 2:1
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
C++ (g++)
题解如下
#include <bits/stdc++.h>
using namespace std;
int main()
{
char s;
char temp[6250001];
memset(temp,'E',sizeof(temp));
int num = 0;
int cnt = 0;
int scorew = 0, scorel = 0;
while (~scanf("%c", &s) && s != 'E')
{
temp[cnt] = s;
cnt++;
}
while (1)
{
if (temp[num] != 'E')
{
if (temp[num] == 'W')
{
scorew++;
}
else if (temp[num] == 'L')
{
scorel++;
}
if ((max(scorel, scorew) >= 11 && min(scorel, scorew) < 10) || (min(scorel, scorew) >= 10 && fabs(scorel - scorew) == 2))//比赛结束条件
{
cout << scorew << ":" << scorel << endl;
scorew = 0;
scorel = 0;
}
num++;
}
else if (temp[num] == 'E')
{
cout << scorew << ":" << scorel << endl;
scorew = 0;
scorel = 0;
break;
}
}
num = 0;
cout << endl;
while (1)
{
if (temp[num] != 'E')
{
if (temp[num] == 'W')
{
scorew++;
}
else if (temp[num] == 'L')
{
scorel++;
}
if ((max(scorel, scorew) >= 21 && min(scorel, scorew) < 20) || (min(scorel, scorew) >= 20 && fabs(scorel - scorew) == 2))
{
cout << scorew << ":" << scorel << endl;
scorew = 0;
scorel = 0;
}
num++;
}
else if (temp[num] == 'E')
{
cout << scorew << ":" << scorel << endl;
scorew = 0;
scorel = 0;
break;
}
}
}
总结
数组初始化可以使用memset函数
头文件#include<cstring>
定义一个数组a,对其初始化用法:memset(a,初始化值,sizeof(a));
连续换行输入可以使用while(~scanf("%",&))或者while(cin>>)
7-2 高精度加法
分数 15
全屏浏览题目切换布局
作者 周强
单位 青岛大学
对于输入的两个不超过100位数字的非负整数,给出两数之和。
输入格式:
在两行中分别给出两个不超过100位数字的非负整数
输出格式:
在一行中输出两数之和
输入样例:
123 12
输出样例:
135
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include <iostream>
using namespace std;
int temp[102];
int main()
{
string a;
string b;
string s;
cin >> a >> b;
if (a.length() < b.length())
{
s = a;
a = b;
b = s;
}
int la = a.length();
int lb = b.length();
int flag = 0; //看最高位是否进位
int num1 = 0; //表示从结果最高位且不为0的数开始输出
//分了2种情况,思路大致相同
if (lb < la)
{
for (int i = la - 1, j = lb - 1; j >= 0; i--, j--) //从个位开始加,加到位数小的最高位
{
temp[i] += a[i] - '0' + b[j] - '0'; //存储这一位数字
if (temp[i] > 9)
{
temp[i] -= 10;
temp[i - 1]++; //进位
}
}
for (int i = la - lb - 1; i >= 0; i--)
{
temp[i] += a[i] - '0'; //依次存储位数大的高位
if (temp[i] > 9)
{
temp[i] -= 10; //进位,如果是最高位进位,就标记flag
if (i == 0)
flag = 1;
else
temp[i - 1]++;
}
}
if (flag)
cout << flag; //最高位进位,输出1
else //如果不进位
{
while (temp[num1] == 0 && num1 != la - 1) //结果不为1位且最高位为0则删去0
{
num1++;
}
}
for (int i = num1; i < la; i++) //依次输出结果每一位
{
cout << temp[i];
}
}
else if (la == lb)
{
for (int i = la - 1; i >= 0; i--)
{
temp[i] += a[i] - '0' + b[i] - '0';
if (temp[i] > 9)
{
temp[i] -= 10;
if (i == 0)
flag = 1;
else
temp[i - 1]++;
}
}
if (flag)
cout << flag;
else
{
while (temp[num1] == 0 && num1 != la - 1)
{
num1++;
}
}
for (int i = num1; i < la; i++)
{
cout << temp[i];
}
}
}
7-3 高精度求累加和
分数 25
全屏浏览题目切换布局
作者 胡伟平
单位 广西科技大学
使用求和公式求1到N的累加和大家都会,但是如果把N值变大呢,比如100位的整数,那该怎么求?
输入格式:
输入在一行中给出1个位数不超过100位的整数N。
输出格式:
对每一组输入,在一行中输出1+2+3+……+N的值。
输入样例:
在这里给出一组输入。例如:
10
输出样例:
在这里给出相应的输出。例如:
55
代码长度限制
16 KB
时间限制
100 ms
内存限制
64 MB
#include <bits/stdc++.h>
using namespace std;
#define N 1024
vector<int> div(vector<int> &A, int b, int &r)//计算大数/小数
{
vector<int> C;
r = 0;
for (int i = A.size() - 1; i >= 0; i--)
{
r = r * 10 + A[i];//需从最高位开始计算
C.push_back(r / b);//将最高为依次加入容器c
r %= b;
}
reverse(C.begin(), C.end());//调转容器
while (C.size() > 1 && C.back() == 0)//如果位数大于两位且最高位是0
C.pop_back();//则删去0
return C;
}
int main()
{
string s;
cin >> s;
int l = s.size();
int ll = l * 2;
int r = 0;
int a[N], b[N], c[N] = {0};
for (int i = 0; i < l; i++)
{
a[i] = s[l - i - 1] - '0';//用整型数组存储每位数
b[i] = s[l - i - 1] - '0';
}
b[0] += 1;//高斯公式:s=n*(n+1)/2
for (int i = 0; i < l; i++)
{
for (int j = 0; j < l; j++)
{
c[i + j] += a[i] * b[j];//模拟手算乘法
}
}
for (int i = 0; i < ll; i++)(n-1)位数相乘结果肯定小于2*n-1位数
{
if (c[i] >= 10)
{
c[i + 1] += c[i] / 10;//依次进位
c[i] %= 10;
}
}
while (ll > 0 && c[ll] == 0)
ll--;//除去空栈
vector<int> rex;//定义容器vector可以灵活变换数字位置
for (int i = 0; i <= ll; i++)
{
rex.push_back(c[i]);//从个位开始依次加入容器rex
}
vector<int> result = div(rex, 2, r);//计算大数除2
for (int i = result.size() - 1; i >= 0; i--)
cout << result[i];//最高位下标为最后一个,依次倒着输出
return 0;
}