CF3B 贪心
来源:互联网 发布:淘宝小类目产品 编辑:程序博客网 时间:2024/06/05 10:45
http://codeforces.com/problemset/problem/3/B
/**CF3B 贪心题目大意;给定一个指定容量的背包,有n种物品,每种物品给定体积(1 or 2)和价值,问背包最多能容的价值是多少,并且求出装了哪几个物品解题思路:背包问题,可惜背包容量过大。采用贪心的思想来做:按照价值/体积的递减顺序排序,从头依次装物品,直到装不下跳出循环。 此时如果背包没有装满,那么肯定差1,有两种方案:1,从后面加价值最大的一个体积为1的物品。2,从前面取价值最小体积为1的物品去掉 然后在后面加上价值最大的一个体积为2的物品,二者取最优*/#include <string.h>#include <algorithm>#include <iostream>#include <stdio.h>using namespace std;struct note{ int x,y; int id,judge; bool operator < (const note & other)const { return x*other.y<other.x*y; }} a[1000505];int n,m,b[1050005];int main(){ while(~scanf("%d%d",&n,&m)) { for(int i=0; i<n; i++) { scanf("%d%d",&a[i].x,&a[i].y); a[i].id=i+1; a[i].judge=0; } sort(a,a+n); int sum=0,flag=-1; for(int i=0; i<n; i++) { if(m-a[i].x>=0) { sum+=a[i].y; a[i].judge=1; m-=a[i].x; flag=i; } else { break; } } if(m>0&&flag<n) { int sum1=-1,sum2=-1,flag1,flag2=-1,flag3; ///后加1 for(int i=flag+1; i<n; i++) { if(a[i].x==1) { sum1=sum+a[i].y; flag1=i; break; } } ///前去1后加2 for(int i=flag; i>=0; i--) { if(a[i].x==1) { sum2=sum-a[i].y; flag2=i; for(int j=flag+1; j<n; j++) { if(a[j].x==2) { sum2+=a[j].y; flag3=j; break; } } break; } } if(sum1>=sum2&&sum1>sum) { sum=sum1; a[flag1].judge=1; } else if(sum2>=sum1&&sum2>sum) { sum=sum2; a[flag2].judge=0; a[flag3].judge=1; } } printf("%d\n",sum); int num=0; for(int i=0; i<n; i++) { if(a[i].judge==1) { b[num++]=a[i].id; } } for(int i=0; i<num; i++) { printf(i==num-1?"%d\n":"%d ",b[i]); } } return 0;}/**3 21 22 71 33 21 21 31 43 32 82 71 33 32 82 72 33 31 41 32 5*/
0 0
- CF3B 贪心
- cf3b(贪心)
- 贪心!
- 贪心~
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 寻找回文数的python的实现
- 设计模式 Singleton 单例 懒汉,线程安全
- 黑马程序员——集合
- (4)全e化的基礎OLTP-POS系統-1
- Haskell趣学指南学习日记(3)
- CF3B 贪心
- LA3635 - Pie
- LeetCode Maximal Square
- Photoshop CS6快捷键大全
- linux程序设计——如何实现popen(第十三章)
- 第一次写博客
- iOS - 地图 - 百度地图环境配置
- R语言的一些学习记录
- 全局变量,静态全局变量,局部变量,静态局部变量