Codeforces 725E Too much money (暴力模拟)

思路:
首先明确一点,为什么按照从大到小依次取,会得不到指定值:
因为,当取了某个位置的某个值(因为相同的值可以有多个)以后,之后所有能取的加起来都不够达到指定值了,所以,放一个值肯定比放多个值加起来和那个值相同来的好。
所以依次遍历所有i

#include
using namespace std;
#define mod 1000000007
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
typedef long long LL;
typedef unsigned long long ULL;

int a[200005];

int main(){
    int n,m,x,f;
    set<int>v;
    scanf("%d%d",&n,&m);
    for(int i=0;iscanf("%d",&x);
        a[x]++;
    }
    for(int i=0;i<=n;i++){
        if(a[i]) v.insert(i);
    }
    if(a[n]){
        printf("Greed is good\n");
        return 0;
    }
    for(int i=1;iif(!a[i]) v.insert(i);
        a[i]++;
        while(x){
            set<int>::iterator p=v.upper_bound(f);
            if(p==v.begin()) break;
            p--;
            int y=(*p);
            x-=min(x/y,a[y])*y;
            f=min(y-1,x);
        }
        if(x){
            printf("%d\n",i);
            return 0;
        }
        if(!(--a[i])) v.erase(i);
    }
    printf("Greed is good\n");
}

你可能感兴趣的:(Codeforces 725E Too much money (暴力模拟))