Codeforces Round #202 B:Color the Fence

贪心的题做的太少,碰到一点感觉都没有。 也是看了别人的题解才做。
对于此题,位数越长,那么数吧必定最大,那么cnt=v/mmin 就得到了最多的位数,那么最优的答案位数已经确定了。接下来就是相当于,我有cnt个空格,让你填1~9,9个数字,在满足限定条件的情况下,我要求最大值。这样子问题是不是一下变得很简单了呢? 限定条件是: 当前我取的数 对应的 值 不能超过总钱,并且选了这个数后,后面的位数不能受到影响,即位数不变。外层循环从cnt-1~0,内层循环9~1 满足条件就输出,高位的数字越大,肯定答案越大。

/*If I get TLE , it is good.If I get AC,it's NICE !*/
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
const int MAXN=1e6+100;
int a[15]={0};
int main(void)
{
    int v;
    cin >> v;
    int mmin=MAXN;
    int maxcnt=0;
    for(int i=1;i<=9;i++)
    {
        scanf("%d",&a[i]);
        mmin=min(mmin,a[i]); // 求出最小的费用,确定位数
    }
    if(v<mmin) 
    {
        printf("-1\n");
        return 0;
    }
    maxcnt=v/mmin;
    //其实下面的过程对位数的判断如果没想过可能一下子想不到,其实也就相当于把当前位后面的数字全遮掉,在限定条件下,然后去求最大可填的数字。
    for(int i=maxcnt-1;i>=0;i--)
    {
        for(int j=9;j>=1;j--)
        {
            if(a[j]<=v && (v-a[j])/mmin >= i)
            {
                printf("%d",j);
                v-=a[j];
                break;
            }
        }
    }
    puts("");
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务