【高精】Oliver的成绩(jzoj 2008)
生活随笔
收集整理的這篇文章主要介紹了
【高精】Oliver的成绩(jzoj 2008)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Oliver的成績
題目大意:
Oliver考了一次試,現(xiàn)在知道他的語數(shù)英的成績,還有年級(jí)其他n個(gè)人的成績,現(xiàn)在問Oliver三科各和年級(jí)第一差多少分,如果Oliver在這一科上是第一,則輸出‘0’
樣例輸入
10 10 10 3 0 80 0 40 0 0 0 0 100樣例輸出
30 70 90數(shù)據(jù)范圍限制
【數(shù)據(jù)范圍】
對(duì)于50%的數(shù)據(jù),0<N<1000,0<M<19.
對(duì)于100%的數(shù)據(jù),0<N<10000,0<M<30.且都為整數(shù)。(M為各科的分?jǐn)?shù)的位數(shù))
解題思路:
直接高精再加上求最大,最后高精減就可以了
代碼:
#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));//預(yù)處理read1(1);//輸入bj(1);//比較read1(2);bj(2);read1(3);bj(3);}gzj(1);//高精減gzj(2);gzj(3); } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的【高精】Oliver的成绩(jzoj 2008)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 后退快捷键是什么
- 下一篇: 【DP】和谐的奶牛(jzoj 1750)