这道是NOIP普及组2007年的一道水题,不过我还是被卡了一小时左右(果然还是自己太鶸的原因吗?)
这道题的遵循规则是 一个大价值的跟上一个小价值的一堆,如果不行就大价值单独为一堆。直到9个物品都被发放完毕为止
附上自己的代码z
#include <iostream> #include <queue> using namespace std; priority_queue<int>a; //这道题我用的优先队列 这个是从大到小排 priority_queue< int,vector<int>,greater<int> >b;//这个是从小到大排 int w,n,s,tot=0,jishu=0; int main(){ cin>>w>>n; for(int i=1;i<=n;i++){ cin>>s; a.push(s); //输入数量并送入队列进行排序 b.push(s); } for(int i=1;i<=n;){ //这个是边界条件 if( a.top()+b.top() > w){ //如果当前最大的加上最小的超过限定的话 就送走最大的 自己思考一下为什么 a.pop(); ++tot; //送走了一堆 ++i; //送走了一个物品 } else { a.pop(); b.pop(); ++tot; //送走了一堆 i=i+2; //送走了两个物品 } } cout<<tot<<endl; return 0; }