題意:給定n,m分別代表字符串長度和可操作次數,接下來給出長度爲n的字符串代表原始成績,要求在m次內得到可以對這個成績也就是實數的滿足四捨五入的最大數,可以不使用完m次機會,並且整數部分只能進位一次
這個題我們首先考慮怎麼最少次數內約到最大數,當然是選擇小數部分的一個最靠前的大於等於5的數字開始向前進位,想到這一步基本上就已經確定答案了,但這個題給了很多限制條件,我們需要逐個考慮實現
注意:如果1.24445,選擇5進位得到1.3算作一次操作次數
代碼如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 200000+7;
char s[maxn];
int main()
{
int n,t;
while(~scanf("%d%d",&n,&t))
{
getchar();
scanf("%s",s+1);
int i=1,f=0;
for( ; i<=n; i++)
{
if(s[i] == '.') f=1;
if(f && s[i] >= '5') {f=2;break;}
if(i == n) break;
}
int flag=0;
if(f == 2)
{
for(; i>=1 && t; i--,t--)
{
if(s[i] >= '5')
{
s[i] = '0';
if(s[i-1] == '.')
{
i--;
i--;
flag=1;
break;
}
s[i-1] += 1;
}
else break;
}
}
int len=i;
if(flag)
{
for(; len>=1; len--)
{
if(s[len] == '9' && len==1) {printf("1");s[len]='0';break;}
else if(s[len] == '9') s[len] = '0';
else {s[len] += 1;break;}
}
}
for(int j=1; j<=i; j++)
printf("%c",s[j]);
printf("\n");
}
return 0;
}