题解 P2983 购买巧克力

**eg:其实这题就是一个简单的贪心,没有什么难度,只要会一点结构体,就会做了。
这题要用有限的钱,买到尽量多的巧克力,但巧克力是有限的,每种巧克力只会有一定的奶牛喜欢,我用ans来存储最多的奶牛数,然后根据价格从高到低排序,然后逐个判断就行了。
这题除了 # n以外的变量,都要开long long类型 **

#include<bits/stdc++.h>
using namespace std;
#define maxn 10000
long long x,y;
long long n,b;
vector < pair < long long, long long > > a;
//vector和数组差不多,只不过他不定长,在不确定数据大小的情况下,vector可能可以节省很多空间
//pair和结构体差不多,只不过他不用写变量名、定义类型名等等,在只有两个量的情况下推荐写pair
long long ans;
#define C getchar()

inline void read(long long &s){
    s=0; int t=1,k=C;
    for (;k<'0'||k>'9';k=C) if (k=='-') t=-1;//判断该数正负 
    for (;k>='0'&&k<='9';k=C) s=(s<<1)+(s<<3)+(k^48);//<<1加上<<3就相当于*10,但是位运算的速度较快,^48也相当于-‘0’,同理,较快。 
    s*=t;
}
#define G(a) putchar(a+48)
inline void write(int s){
    if (s<0) G(-3),s=-s;
    if (s>9) write(s/10);
    G(s%10);
}
int main(){
	read(n);
	read(b);
	for(int i=1;i<=n;i++){
		read(x);
		read(y);
		a.push_back({x, y});
		}
	sort(a.begin(), a.end());
	 //在a数组中插入一个元素在末尾,{x, y}表示一个pair型的量,第一个元素是x,第二个是y
    for(long long i = 0; i < n; i++) {
    //vector数组第一个数下标为0
  if(b / a[i].first < a[i].second) {
        //如果这种巧克力不能满足所有奶牛
            ans += b / a[i].first;
            //那么满足能满足的奶牛,满足完毕后肯定不能再满足其它奶牛了
            break;
            //跳出循环
        }
        //如果可以满足所有奶牛,那么全部满足
        ans += a[i].second;
        b -= a[i].first * a[i].second;
        //这里的.first .second表示调用这个结构体中第一个元素、第二个元素
    }
    write(ans);
    return 0;
}	 

p2983

posted @ 2019-01-30 11:31  floatingcloak  阅读(110)  评论(0编辑  收藏  举报