【NOIP 模拟题】[T1]连锁店(贪心)

来源:互联网 发布:php打印实心菱形 编辑:程序博客网 时间:2024/05/17 06:07

【题解】【贪心】

把店按照ai-bi从小到大排序,然后每个店不断兑换直到不能换为止。假如先选了ai-bi大的,后选了 ai-bi小的,那么把前面的换成后面的,剩下的瓶子更多。ai-bi相等的顺序随便,因为总能把ai 最小的选满

【由于范围很大,所以要用无符号整型,所以要判断ai和bi的大小关系,如果bi>ai,且ai<=s,那么就输出-1,否则,bi>ai的情况不能加入数据中】

#include<queue>#include<cstdio>#include<cstring>#include<algorithm>#define ll unsigned long longusing namespace std;struct node{ll give,back,lose;int opt;}a[100010];int n;ll m,cnt,ans;int tmp(node x,node y){return (x.lose<y.lose||x.lose==y.lose&&x.give<y.give);}int main(){freopen("store.in","r",stdin);freopen("store.out","w",stdout);int i,j;scanf("%d%I64lu",&n,&m);for(i=1;i<=n;++i) { ll x,y; scanf("%I64lu%I64lu",&x,&y); if(y>=x&&m>=x) {printf("-1\n"); return 0;} a[++cnt].give=x; a[cnt].back=y; a[cnt].lose=x-y; }sort(a+1,a+cnt+1,tmp);for(i=1;i<=cnt;++i) if(m>=a[i].give)  {  ll sum=m-a[i].give;ll k=sum/a[i].lose;  m-=(k+1)*a[i].lose;  ans+=k+1;  }printf("%I64lu\n",ans);return 0;}


0 0
原创粉丝点击