题目描述:
ZZ市准备在绿博园举办一次花卉节。Dr.Kong接受到一个任务,要买一批花卉进行布置园林。
能投入买花卉的资金只有B元 (1 <= B <= 10^18) 。Dr.Kong决定做一个社会调查,统计一下市民们都喜欢哪种花卉,以便在有限的资金范围内,让更多的市民都能找到并标注一盆自己喜欢的花卉(一盆花只能一位市民标注)。
经调查统计,市场上有N (1 <= N<=100,000)种不同类型的花卉,第i种花卉的价格是Pi(1 <= Pi <= 10^18) 。有Ci (1 <= Ci <= 10^18) 个市民喜欢。
你能帮助Dr.Kong计算一下,在不透支的情况下,如何购买花卉才能让更多的市民都能找到并标注一盆自己喜欢的花卉?
例如:Dr.Kong 有 50块钱,有5种不同类型的花卉:
花卉类型 价格/盆 喜欢该类型花卉市民的人数
1 5 3
2 1 1
3 10 4
4 7 2
5 60 1
显然,Dr.Kong不能购买第5种类型的花卉,因为他不够钱。
下面的购买方案是最优的:
第1种花卉买3盆;第2种花卉买1盆;第3种花卉买2盆;第4种花卉买2盆。
总共花费:5*3+1*1+10*2+7*2=50,这样,Dr.Kong 最多能让3+1+2+2 =8 人满意
输入格式 Input Format
第1行: N B
第2..N+1行: Pi Ci (i=1,2,....,N)。
输出格式 Output Format
一个整数,最多可以让多少市民满意
样例输入 Sample Input
5 50
5 3
1 1
10 4
7 2
60 1
样例输出 SampleOutput
8
时间限制 Time Limitation
1s
来源 Source
haoi2013
思路:
看到这道ZZ省选题,本来就以为是一个普通的贪心,直接将所有花的价格从小到大排序,然后直接统计多少人就好,但数据并没有那么乐观........(QAQ)
所以注意的是:在题中所有的变量全部用long long,并且long long 乘以long long 会爆long long 这的注意,还有别忘了变量的初值...MD又被坑了QAQ
代码:
#include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<cstdio> using namespace std; struct QAQ { long long s; long long v; }a[101000]; inline long long read() { char ch=getchar(); long long x=0,f=1; while(ch>'9'||ch<'0') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch=getchar(); } return x*f; } bool mycmb(QAQ x,QAQ y) { return (x.v<y.v); } int main() { //freopen("add.in","r",stdin); //freopen("add.out","w",stdin); long long n,b; cin>>n>>b; for(int i=1;i<=n;i++) { a[i].v=read(); a[i].s=read(); } sort(a+1,a+1+n,mycmb); long long ans=0; long long now=b; long long h=b; for(int j=1;j<=n;j++) { //bool flag=false; if(a[j].s*a[j].v>=0&&now>=a[j].s*a[j].v) { now=now-(a[j].s)*(a[j].v); ans+=a[j].s; } else { long long y=a[j].s; while(h>0) { h-=a[j].v; if(h<0) break; ans++; y--; if(y<0) break; } break; } h=now; } cout<<ans<<endl; return 0; }