Sorting Railway Cars
cf 605A
题意:
——————————
——————————
Efim and Strange Grade
cf 719C
题意:在小数点后进行四舍五入,四舍五入次数不得多于t
基本思路:贪心,因为所在位越高,一次四舍五入带来的价值就越大,所以从前往后搜能进行四舍五入的最高位,并从此处开始往前进位。
奇妙的数据
5 2
9.499
ans:10
不可带有后缀0以及小数点,有连续进位
本题思路就是贪心+模拟,因为输入的数据很长,所以用字符串处理。要注意小数点的占位;要注意进位;要注意后缀0。
ac代码如下:
char a[200007];
int main()
{
int n;
ll t;
cin>>n>>t;
int len=n;
a[0]='0';//整数部分也可能需要进位,这个元素必不可少
scanf("%s",a+1);
int j;
int flag00=0;
for(j=1;j<=n;j++){
if(a[j]=='.'){
flag00=1;
}
if(flag00==1&&a[j]-'0'>=5){
len=j;
break;
}
}
int i;
for(i=j;i>=1;i--){
if(a[i]=='.')
break;
//检查进位
if(a[i]-'0'>9){
if(a[i-1]!='.')
a[i-1]++;
else
a[i-2]++;
a[i]='0';
}
if(t>0&&a[i]-'0'>=5){
if(a[i-1]!='.')
a[i-1]++;
else
a[i-2]++;
//cout<<"a[i-1]="<<a[i-1]<<endl;
len--;
t--;
}
}
//继续检查进位
for(;i>=1;i--){
if(a[i]-'0'>9){
if(a[i-1]!='.'){
a[i-1]++;
}
else{
a[i-2]++;
}
a[i]='0';
}
//cout<<"a[i]="<<a[i]<<endl;
}
//删除后缀0
int flag=0;
for(int k=len;k>=1;k--){
if(a[k+1]=='.')
break;
// cout<<"a[j]="<<a[j]<<endl;
// bool x=flag==0&&(a[j]=='0'||a[j]=='.');
// cout<<"bool="<<x<<endl;
if(flag==0&&(a[k]=='0'||a[k]=='.')){
len--;
//cout<<"len="<<len<<endl;
}
if(a[k]-'0'>0){
flag=1;
}
}
// for(int x=0;x<=n;x++){
// cout<<a[x]<<' ';
// }
// cout<<endl;
//输出
for(int k=0;k<=len;k++){
if(k==0&&a[k]=='0')
continue;
cout<<a[k];
}
cout<<endl;
}