Codeforces718A. Efim and Strange Grade贪心

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


n f n n ! = ∑ i = 1 n − 1 f i i ! × f n − 1 − i ( n − 1 − i ) ! n{\frac{f_n}{n!}} = \sum_{i=1}^{n-1}\frac{f_i}{i!}\times \frac{f_{n-1-i}}{(n-1-i)!} nn!fn=i=1n1i!fi×(n1i)!fn1i
g n = 1 n ∑ i = 1 n − 1 g i × g n − 1 − i g_n=\frac{1}{n}\sum_{i=1}^{n-1}g_i\times g_{n-1-i} gn=n1i=1n1gi×gn1i

目录

题意:传送门

 原题目描述在最下面。
 给你一个大数字,问你小数点后最多进位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;
}

原题目描述:

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值