原题地址:http://codeforces.com/contest/719/problem/C
题意:给出一个数字,你有t次四舍五入的机会,问你在使用<=t次的四舍五入的机会后,最后最大的数字是多少.
思路:首先一个很明显的贪心策略.要想使数字最大,进位的数字肯定是小数点最左边>=5的位置.然后我们考虑向左一步一步进位.
这题对前面的整数部分也要进行处理,一开始被恶心到了.
注意:由于数据有2e5,所以需要开char数组进行处理.
#include <bits/stdc++.h>
#define eps 1e-8
#define INF 0x3f3f3f3f
#define MOD 1e9+7
#define PI acos(-1)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define CLR(x,y) memset((x),y,sizeof(x))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 2e5 + 5;
int n, t;
char x[maxn];
char str[maxn];
char ch[maxn];
int main() {
scanf("%d%d", &n, &t);
scanf("%s", ch);
int pos = 0;
for(pos = 0;; pos++) {
if(ch[pos] == '.') break;
else x[pos] = ch[pos];
}
pos++;
for(int i = 0; ch[pos]; i++, pos++) {
str[i] = ch[pos];
}
pos = -1;
for(int i = 0; str[i]; i++) {
if(str[i] >= '5') {
pos = i;
break;
}
}
//上面的操作就是给x数组附整数,str数组赋小数
int flag = 0;
for( int i = pos; i >= 0 && t > 0; i--) {
if(i != 0 && str[i] >= '5') {//如果能进位就进位
str[i - 1]++;
str[i] = 0;
} else if(i == 0 && str[i] >= '5') flag = 1;//如果能使整数进位就标记
else break;
t--;
}
if(!flag)printf("%s.%s\n", x, str);
else {
int lenn = strlen(x);
int num = 0; //9进位添0的数量
int i;
for(i = lenn - 1; i >= 0; i--) {//边扫边改
if(x[i] != '9') {
x[i]++;
break;
} else {
x[i] = '0';
num++;
}
}
if(num == lenn) printf("1");//如果整数全是9就要在最前面加个1
printf("%s", x);
}
return 0;
}