CF 3B Lorry
2015-07-09 11:18
274 查看
sort + greedy
为了满足各种判断条件 这样做应该是比较优的
全都用1的 全都用2的 1 2混合使用的
为了满足各种判断条件 这样做应该是比较优的
全都用1的 全都用2的 1 2混合使用的
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; typedef long long LL; const int MAX = 1e5 + 1000; struct bb { int t,p,num; } kay[MAX],aca[MAX]; int cmp(const bb & a,const bb & b) { return a.p > b.p; } int n,v,num[MAX],sum_num; int main() { while(~scanf("%d%d",&n,&v)) { int t,p; int num_kay = 0,num_aca = 0; for(int i = 0; i < n; i ++) { scanf("%d%d",&t,&p); if(t%2 == 0) { aca[num_aca].t = t; aca[num_aca].p = p; aca[num_aca].num = i + 1; num_aca ++; } else { kay[num_kay].t = t; kay[num_kay].p = p; kay[num_kay].num = i + 1; num_kay ++; } } sort(kay,kay+num_kay,cmp); sort(aca,aca+num_aca,cmp); LL sum1[MAX],sum2[MAX]; sum1[0] = 0; sum2[0] = 0; for(int i = 1; i <= num_kay; i ++) sum1[i] = sum1[i-1] + (LL)kay[i-1].p; for(int i = 1; i <= num_aca; i ++) sum2[i] = sum2[i-1] + (LL)aca[i-1].p; int h1 = 0,h2 = 0,p1,p2; LL ans = 0,sum = 0; for(int i = 0; i <= num_kay; i ++) { if(i > v) break; int rest = v - i; if(rest >= num_aca*2) p2 = num_aca; else p2 = rest /2; sum = sum1[i] + sum2[p2]; if(sum > ans) { ans = sum; h1 = i; h2 = p2; } } cout<<ans<<endl; sum_num = 0; for(int i = 0;i < h2;i ++) { num[sum_num ++] = aca[i].num; } for(int i = 0;i < h1;i ++) { num[sum_num ++] = kay[i].num; } sort(num,num+sum_num); for(int i = 0;i < sum_num;i ++) cout<<num[i]<<" "; cout<<endl; } return 0; } /** 3 2 1 2 2 7 1 3 sum1 3 2 sum2 7 4 3 1 4 2 6 1 1 1 1. sum1 4 1 1 sum2 6 2 2 1 4 2 6 sum1 4 sum2 6 */
相关文章推荐
- iOS中滤镜的使用(二)滤镜组合
- Socket编程知识必学
- 简述spring mvc 和spring
- js拼接json格式数据
- 二叉搜索树(C++)
- IOS正则表达式的简单介绍
- 学习笔记之#pragma
- 二叉搜索树(C++) 分类: C/C++ 数据结构与算法 2015-07-09 11:18 205人阅读 评论(0) 收藏
- JS原生函数总结
- 创业项目开发阶段性总结
- [LeetCode][Java] Longest Common Prefix
- linux shell中 if else以及大于、小于、等于逻辑表达式介绍
- Linked List Cycle II
- 软件测试方法汇总
- LXC Linux Containers内核轻量级虚拟化技术
- 正则表达式
- 判断jQuery对象或dom对象是否存在
- Android 代码混淆
- 删除.SVN+批量删除/增加文件
- VS 20** OpenGL 配置