题解 P2983 购买巧克力
Posted floatingcloak
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解 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 购买巧克力的主要内容,如果未能解决你的问题,请参考以下文章
洛谷—— P2983 [USACO10FEB]购买巧克力Chocolate Buying
洛谷P2983 [USACO10FEB]购买巧克力Chocolate Buying(贪心)
Codeforces Round #757 div.2 A-D题解
Codeforces Round #757 div.2 A-D题解