Oliver的成绩
题目大意:
Oliver考了一次试,现在知道他的语数英的成绩,还有年级其他n个人的成绩,现在问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.且都为整数。(M为各科的分数的位数)
解题思路:
直接高精再加上求最大,最后高精减就可以了
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
using namespace std;
int n,a[5][35],b[5][35],first[5][35],c[35],p[5];
string str;
void read(int km)
{cin>>str;//输出while (str[0]<'0'||str[0]>'9') cin>>str;for (int i=1;i<=str.size();i++)a[km][30-str.size()+i]=str[i-1]-48;//存在字符串里
}
void read1(int km)
{cin>>str;while (str[0]<'0'||str[0]>'9') cin>>str;for (int i=1;i<=str.size();i++)b[km][30-str.size()+i]=str[i-1]-48;
}
void bj(int km)
{int i;for (i=1;i<=30;++i)if (b[km][i]!=first[km][i]) break;if (b[km][i]>first[km][i])//比较{for (i=1;i<=30;++i)first[km][i]=b[km][i];p[km]=1;//有人比Oliver成绩好}
}
void gzj(int km)
{if (!p[km]){printf("0 ");return;}int jw=0,k=1;for (int i=30;i>0;--i)if (first[km][i]-jw>=a[km][i])//不用借位{c[i]=first[km][i]-jw-a[km][i];//减jw=0;//清空}else {c[i]=first[km][i]+10-jw-a[km][i];//要借位jw=1;//记录}while(c[k]==0&&k<=30) k++;//清掉前面的0for (int i=k;i<=30;++i)printf("%d",c[i]);//输出printf(" ");
}
int main()
{read(1);//输入Oliver三科的成绩read(2);read(3);for (int i=1;i<=30;++i){first[1][i]=a[1][i];//初值first[2][i]=a[2][i];first[3][i]=a[3][i];}scanf("%d",&n);for (int i=1;i<=n;++i){memset(b,0,sizeof(b));//预处理read1(1);//输入bj(1);//比较read1(2);bj(2);read1(3);bj(3);}gzj(1);//高精减gzj(2);gzj(3);
}