zoukankan      html  css  js  c++  java
  • Too Much Money

    Too Much Money
    time limit per test
    2 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    Alfred wants to buy a toy moose that costs c dollars. The store doesn’t give change, so he must give the store exactly c dollars, no more and no less. He has n coins. To make c dollars from his coins, he follows the following algorithm: let S be the set of coins being used. S is initially empty. Alfred repeatedly adds to S the highest-valued coin he has such that the total value of the coins in S after adding the coin doesn’t exceed c. If there is no such coin, and the value of the coins in S is still less than c, he gives up and goes home. Note that Alfred never removes a coin from S after adding it.

    As a programmer, you might be aware that Alfred’s algorithm can fail even when there is a set of coins with value exactly c. For example, if Alfred has one coin worth $3, one coin worth $4, and two coins worth $5, and the moose costs $12, then Alfred will add both of the $5 coins to S and then give up, since adding any other coin would cause the value of the coins in S to exceed $12. Of course, Alfred could instead combine one $3 coin, one $4 coin, and one $5 coin to reach the total.

    Bob tried to convince Alfred that his algorithm was flawed, but Alfred didn’t believe him. Now Bob wants to give Alfred some coins (in addition to those that Alfred already has) such that Alfred’s algorithm fails. Bob can give Alfred any number of coins of any denomination (subject to the constraint that each coin must be worth a positive integer number of dollars). There can be multiple coins of a single denomination. He would like to minimize the total value of the coins he gives Alfred. Please find this minimum value. If there is no solution, print "Greed is good". You can assume that the answer, if it exists, is positive. In other words, Alfred's algorithm will work if Bob doesn't give him any coins.

    Input

    The first line contains c (1 ≤ c ≤ 200 000) — the price Alfred wants to pay. The second line contains n (1 ≤ n ≤ 200 000) — the number of coins Alfred initially has. Then n lines follow, each containing a single integer x (1 ≤ x ≤ c) representing the value of one of Alfred's coins.

    Output

    If there is a solution, print the minimum possible total value of the coins in a solution. Otherwise, print "Greed is good" (without quotes).

    Examples
    input
    12
    3
    5
    3
    4
    output
    5
    input
    50
    8
    1
    2
    4
    8
    16
    37
    37
    37
    output
    Greed is good
    Note

    In the first sample, Bob should give Alfred a single coin worth $5. This creates the situation described in the problem statement.

    In the second sample, there is no set of coins that will cause Alfred's algorithm to fail.

    分析:从小到大枚举答案,然后模拟这个贪心过程,如果不能达到c,则输出答案;

       在贪心过程中注意优化,now-=max(1,min(now/(*a),num[*a]))*(*a);

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <algorithm>
    #include <climits>
    #include <cstring>
    #include <string>
    #include <set>
    #include <map>
    #include <unordered_map>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <list>
    #define rep(i,m,n) for(i=m;i<=n;i++)
    #define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++)
    #define mod 1000000007
    #define inf 0x3f3f3f3f
    #define vi vector<int>
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    #define ll long long
    #define pi acos(-1.0)
    #define pii pair<int,int>
    #define Lson L, mid, ls[rt]
    #define Rson mid+1, R, rs[rt]
    #define sys system("pause")
    #define freopen freopen("in.txt","r",stdin)
    const int maxn=2e5+10;
    using namespace std;
    ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
    ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;}
    inline ll read()
    {
        ll x=0;int f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int n,m,k,t,c,num[maxn];
    set<int>p,tmp;
    int main()
    {
        int i,j;
        scanf("%d%d",&c,&n);
        rep(i,1,n)scanf("%d",&j),p.insert(j),num[j]++;
        rep(i,1,c)
        {
            int now=c;
            tmp.clear();
            p.insert(i);
            num[i]++;
            while(now>0)
            {
                if(p.empty())return 0*printf("%d
    ",i);
                auto a=p.lower_bound(now);
                if(a==p.end()||(*a>now&&a!=p.begin()))a--;
                tmp.insert(*a);
                now-=max(1,min(now/(*a),num[*a]))*(*a);
                p.erase(*a);
            }
            if(now<0)return 0*printf("%d
    ",i);
            for(int x:tmp)p.insert(x);
            if(--num[i]==0)p.erase(i);
        }
        puts("Greed is good");
        //system("Pause");
        return 0;
    }
  • 相关阅读:
    ie6 ie7 ie8 ie9 firefox css hack
    小型数据分页
    AsyncTask 使用须知
    调用startActivityForResult,onActivityResult无响应的问题
    Android之背景图片设置为重复而不是默认的拉伸
    Android Service之Messenger实现通信
    android之.9.png图片应用
    小米2及其他Android手机无法连接mac解决方案
    纯CSS3打造滑动下拉导航菜单
    DIV制作气泡对话框 兼容IE6
  • 原文地址:https://www.cnblogs.com/dyzll/p/6002477.html
Copyright © 2011-2022 走看看