Codeforces Round #373 (Div. 2) C. Efim and Strange Grade (模拟)

原题地址: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;
}

猜你喜欢

转载自blog.csdn.net/yiqzq/article/details/81456524
今日推荐