Codeforces718A. Efim and Strange Grade贪心

(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦

目录

题意:传送门

 原题目描述在最下面。
 给你一个大数字,问你小数点后最多进位m次能得到的最大数字是多少?

思路:

 找到第一个能进位的地方。然后判断一下前面有多少个4,因为4还能再进位。然后再判断一下前面有多少个9。最后判断一下如果进位到小数点前面去了,然后小数点前一位是9这个情况。
 基本上差不多了。原谅我码力太差,写的这么冗长。

AC代码:

#pragma comment(linker,"/STACK:102400000,102400000")
#include <bits/stdc++.h>
#define mme(a,b) memset((a),(b),sizeof((a)))  
#define fuck(x) cout<<"* "<<x<<"\n"
#define iis std::ios::sync_with_stdio(false)
using namespace std;
typedef long long LL;
typedef unsigned long long uLL;
const int INF = 0x3f3f3f3f;
const int mod = 998244353;
const double eps = 1e-8;
const int N = 2e5 + 7;
const int MX = 1e5 + 7;
const uLL base = 131;
int n, m, k,la;
char ar[N],br[N],cr[N];
void hhh(){
  if(cr[0]=='9'){
    cr[0]++;
    for(int i=0;i<la;++i){
      if(cr[i]>'9'){
        cr[i]='0';
        ++cr[i+1];
        if(i==la-1){
          cr[i+1]='1';
          ++la;
        }
      }
    }
    cr[la]='\0';
    for(int i=0;i<la;++i){
      br[i] = cr[la-1-i];
    }
    printf("%s\n", br);
  }else{
    br[la-1]++;
    printf("%s\n", br);
  }
}
int main(){
  int tim,tc = 0;
  //scanf("%d", &tim);
  while(~scanf("%d%d",&n,&m)){
    int a=0;
    memset(ar,0,sizeof(ar));
    memset(br,0,sizeof(br));
    scanf("%s",cr);
    int len = strlen(cr);
    for(a=0;a<len;++a){
      if(cr[a]=='.')break;
      br[a]=cr[a];
    }
    la=a++;
    for(int i=0;a<len;++a,++i){
      ar[i]=cr[a];
    }
    len = len - la-1;
    br[la]='\0';ar[len]='\0';
    int p=-1,four=0;
    memset(cr,0,sizeof(cr));
    for(int i=0;i<la;++i){
      cr[i] = br[la-1-i];
    }
    for(int i=0;i<len;++i){
      if(ar[i]>='5'){
        p=i;break;
      }
    }
    for(int i=p-1;i>=0;--i){
      if(ar[i]=='4')four++;
      else break;
    }
    if(p==-1){
      printf("%s.%s\n", br,ar);
    }else{
      if(p==0){
        hhh();
      }else{
        int qianJing = min(m,four+1);
        if(qianJing>p){
          hhh();
          continue;
        }
        if(ar[p-qianJing]=='9'){
          int t = p-qianJing;
          while(t&&ar[t]=='9'){
            --t;
          }
          if(t=-1){
            hhh();
          }else{
            ar[t]++;
            ar[t+1]='\0';
            printf("%s.%s\n", br,ar);
          }
        }else{
          ar[p-qianJing]=ar[p-qianJing]+1;
          ar[p-qianJing+1]='\0';
          printf("%s.%s\n", br,ar);
        }
      }
    }
  }
  return 0;
}


原题目描述:

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_39599067/article/details/81455939