CodeForces 718A Efim and Strange Grade (貪心)

題意:給定n,m分別代表字符串長度和可操作次數,接下來給出長度爲n的字符串代表原始成績,要求在m次內得到可以對這個成績也就是實數的滿足四捨五入的最大數,可以不使用完m次機會,並且整數部分只能進位一次

這個題我們首先考慮怎麼最少次數內約到最大數,當然是選擇小數部分的一個最靠前的大於等於5的數字開始向前進位,想到這一步基本上就已經確定答案了,但這個題給了很多限制條件,我們需要逐個考慮實現

注意:如果1.24445,選擇5進位得到1.3算作一次操作次數

代碼如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 200000+7;

char s[maxn];

int main()
{
    int n,t;
    while(~scanf("%d%d",&n,&t))
    {
        getchar();
        scanf("%s",s+1);

        int i=1,f=0;
        for( ; i<=n; i++)
        {
            if(s[i] == '.') f=1;
            if(f && s[i] >= '5') {f=2;break;}

            if(i == n) break;
        }

        int flag=0;
        if(f == 2)
        {
            for(; i>=1 && t; i--,t--)
            {
                if(s[i] >= '5')
                {
                    s[i] = '0';

                    if(s[i-1] == '.')
                    {
                        i--;
                        i--;
                        flag=1;
                        break;
                    }

                    s[i-1] += 1;
                }
                else break;
            }
        }

        int len=i;
        if(flag)
        {
            for(; len>=1; len--)
            {
                if(s[len] == '9' && len==1) {printf("1");s[len]='0';break;}
                else if(s[len] == '9') s[len] = '0';
                else {s[len] += 1;break;}
            }
        }

        for(int j=1; j<=i; j++)
            printf("%c",s[j]);
        printf("\n");
    }

    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章