CodeForces 718A Efim and Strange Grade (贪心)

Posted dwtfukgv

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces 718A Efim and Strange Grade (贪心)相关的知识,希望对你有一定的参考价值。

题意:给定一个浮点数,让你在时间 t 内,变成一个最大的数,操作只有把某个小数位进行四舍五入,每秒可进行一次。

析:贪心策略就是从小数点开始找第一个大于等于5的,然后进行四舍五入,完成后再看看是不是还可以,一循环下去,直到整数位,或者没时间了。

代码如下:

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <set>
#include <queue>
#include <algorithm>
#include <vector>
#include <map>
#include <cctype>
#include <cmath>
#include <stack>
#include <tr1/unordered_map>
#define freopenr freopen("in.txt", "r", stdin)
#define freopenw freopen("out.txt", "w", stdout)
using namespace std;
using namespace std :: tr1;

typedef long long LL;
typedef pair<int, int> P;
const int INF = 0x3f3f3f3f;
const double inf = 0x3f3f3f3f3f3f;
const LL LNF = 0x3f3f3f3f3f3f;
const double PI = acos(-1.0);
const double eps = 1e-8;
const int maxn = 2e5 + 5;
const int mod = 1e9 + 7;
const int N = 1e6 + 5;
const int dr[] = {-1, 0, 1, 0, 1, 1, -1, -1};
const int dc[] = {0, 1, 0, -1, 1, -1, 1, -1};
const char *Hex[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
inline LL gcd(LL a, LL b){  return b == 0 ? a : gcd(b, a%b); }
int n, m;
const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
inline int Min(int a, int b){ return a < b ? a : b; }
inline int Max(int a, int b){ return a > b ? a : b; }
inline LL Min(LL a, LL b){ return a < b ? a : b; }
inline LL Max(LL a, LL b){ return a > b ? a : b; }
inline bool is_in(int r, int c){
    return r >= 0 && r < n && c >= 0 && c < m;
}
char s[maxn];
int a[maxn], b[maxn];

int main(){
    while(scanf("%d %d", &n, &m) == 2){
        scanf("%s", s);
        int cnta = 0, cntb = 0;
        a[0] = b[0] = 0;
        bool ok = false;
        for(int i = 0; i < n; ++i){
            if(s[i] == ‘.‘){ ok = true;  continue; }
            if(ok) b[++cntb] = s[i] - ‘0‘;
            else a[++cnta] = s[i] - ‘0‘;
        }
        int cnt = 0;
        int y = 1, z = cntb;

        while(m--){
            ok = false;
            bool x = true;
            for(int i = y; i <= z; ++i){
                if(b[i] >= 5){
                    x = false;
                    cnt = 1;
                    ok = true;
                    b[i] = -1;
                    for(int j = i-1; j >= 0; --j){
                        if(b[j] + cnt > 9){ b[j] = -1;  z = j; }
                        else { b[j] += cnt;  y = j; cnt = 0; break;  }
                    }
                }
                if(ok)  break;
            }

            if(x)  break;

        }

        if(b[0]){
            cnt = 1;
            for(int j = cnta; j >= 0; --j){
                if(a[j] + cnt > 9)  a[j] = 0, cnt = 1;
                else { a[j] += cnt;  cnt = 0; break; }
            }
            if(a[0])  printf("1");
            for(int i = 1; i <= cnta; ++i)
                printf("%d", a[i]);
        }
        else{
            int t = 0;
            for(int i = 1; i <= cntb; ++i)  if(b[i] == -1){ t = i;  break; }
            if(!t) t = cntb;
            for(int i = t; i > 0; --i)
                if(b[i] == 0 || b[i] == -1)  b[i] = -1;
                else break;

            for(int i = 1; i <= cnta; ++i)
                    printf("%d", a[i]);
            if(b[1] != -1){
                printf(".");
                for(int i = 1; i <= cntb; ++i)
                    if(b[i] == -1)  break;
                    else  printf("%d", b[i]);
            }
        }
        printf("\n");

    }
    return 0;
}

 

以上是关于CodeForces 718A Efim and Strange Grade (贪心)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces 85 DSum of Medians

CodeForces 621AWet Shark and Odd and Even

codeforces 621A Wet Shark and Odd and Even

CodeForces 621A Wet Shark and Odd and Even

codeforces 621D Rat Kwesh and Cheese

codeforces 621C Wet Shark and Flowers