2020.02.16普及C组模拟赛7(第一题)

1.Oliver的成绩(score)

题目描述

Oliver进入初中后,觉得自己不能总是玩儿了,应该要好好学习了。正好一次考试结束了,Oliver想知道自己的语文,数学,英语分别与语文年级第一,数学年级第一,英语年级第一相差多少。由于Oliver所在年级有N个人,所以Oliver想你编个程序帮帮他。

输入

score.in共3N+4行,第一~三行分别为Oliver的语文数学英语成绩(位数M),第四行为N,以下3N行,每行一个数(它们的位数是M),分别为第N个同学的语文,数学,英语成绩。
即:Oliver的语文
Oliver的数学
Oliver的英语
N
第一个人的语文
数学
英语
第二个人的语文

输出

score.out共一行,有三个数,分别为Oliver的语文数学英语与年级第一的差。
如果Oliver是第一,则输出0.

样例输入

10
10
10
3
0
80
0
40
0
0
0
0
100

样例输出

30 70 90

数据范围限制

【数据范围】
对于50%的数据,0<N<1000,0<M<19.
对于100%的数据,0<N<10000,0<M<30.且都为整数。

正解
字符串和高精度
AC代码

#include<iostream>
#include<cstdio>
using namespace std;
string a,b,c,ma,mb,mc,m1a,m1b,m1c,mm;
int n;
string pd(string x,string mmax)//判断大小
{
	if(x.size()<mmax.size())return mmax;
	if(x.size()>mmax.size())return x; 
	for(int i=0;i<x.size();i++)
	{ 
		if(x[i]>mmax[i])return x;
	    if(x[i]<mmax[i])return mmax;
	}
	return mmax;
}
void gjj(string x,string y)//高精减
{
	mm="";
	int m=x.size()-1;
 	while(x.size()>y.size())y='0'+y;//补零
	for(int i=m;i>=0;i--)
	{
		int x1=x[i]-48,y1=y[i]-48;
		if(y1>x1)
		{
			mm=char(x1+10-y1+48)+mm;
			x[i-1]=char(x[i-1]-1);
		}
		else mm=char(x1-y1+48)+mm;
	}
	int k=0;
	while(mm[k]=='0'&&k<mm.size()-1)k++;//开头不为零
	for(int i=k;i<mm.size();i++)
	 cout<<mm[i];
	cout<<' ';
}
int main()
{
	freopen("score.in","r",stdin);
	freopen("score.out","w",stdout);
	cin>>a>>b>>c;
	ma=m1a=a;//初值
	mb=m1b=b;
	mc=m1c=c;
	cin>>n;
	for(int i=1;i<=n;i++)
    {
    	cin>>a>>b>>c;
    	m1a=pd(a,m1a);//高精度判断
		m1b=pd(b,m1b);
		m1c=pd(c,m1c);
	}
	gjj(m1a,ma);//高精减
	gjj(m1b,mb);//高精减
	gjj(m1c,mc);//高精减
	return 0;
}

下面附本次比赛的其他题目

2020.02.16普及C组模拟赛7(第一题)
2020.02.16普及C组模拟赛7(第二题)
2020.02.16普及C组模拟赛7(第三题)
2020.02.16普及C组模拟赛7(第四题)
2020.02.16普及C组模拟赛7(总结)

谢谢

发布了75 篇原创文章 · 获赞 104 · 访问量 2395

猜你喜欢

转载自blog.csdn.net/weixin_45524309/article/details/104543720