博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CodeForces 521D nice贪心
阅读量:5116 次
发布时间:2019-06-13

本文共 2372 字,大约阅读时间需要 7 分钟。

//

//有三种升级技能的策略:1、=; 2、+=;3、*=。最优的升级顺序显然是先使用策略1,再策略2,再策略3

//赋值变加(对于每一种技能只考虑增益最大的赋值操作),加变乘(对于每一种技能优先考虑增益最大的加法),在不超过总升级方案的前提下,排序后选出 m 种所乘系数最大的升级方案。因为再原方案都是乘法方案的情况下,先乘哪个数并不会影响最终结果,所以只需要再将 m 种方案处理成合法的顺序即可(根据策略种类排序;原方案是加法方案同理)

1 #include "iostream" 2 #include "cstdio" 3 #include "cstring" 4 #include "vector" 5 #include "utility" 6 #include "algorithm" 7 using namespace std; 8 vector
a; 9 int t[100005][3];10 vector
> t1;11 vector
> > t2;12 vector
> t3;13 vector
> sol;14 int k, n, m;15 16 int main()17 {18 int i, j;19 scanf("%d%d%d", &k, &n, &m);20 a.resize(k + 1);21 t1.resize(k + 1);22 t2.resize(k + 1);23 for(i = 1; i <= k; ++i) {24 scanf("%d", &a[i]);25 }26 for(i = 1; i <= n; ++i) {27 scanf("%d%d%d", &t[i][0], &t[i][1], &t[i][2]);28 switch(t[i][0]) {29 case 1:30 if(t1[t[i][1]].first < t[i][2]) {31 t1[t[i][1]].first = t[i][2];32 t1[t[i][1]].second = i;33 }34 break;35 case 2:36 t2[t[i][1]].push_back(make_pair(t[i][2], i));37 break;38 case 3:39 t3.push_back(make_pair(t[i][2], i));40 }41 }42 /*for(i = 1; i <= k; ++i) {43 printf("t1 %d %d\n", t1[i].first, t1[i].second);44 for(j = 0; j < t2[i].size(); ++j)45 printf("t2 %d %d\n", t2[i][j].first, t2[i][j].second);46 }47 for(i = 0; i < t3.size(); ++i)48 printf("t3 %lf %d\n", t3[i].first, t3[i].second);*/49 50 for(i = 1; i <= k; ++i) {51 if(t1[i].first > a[i]) {52 t2[i].push_back(make_pair(t1[i].first - a[i], t1[i].second));53 //printf("zhuan %d %d\n", make_pair(t1[i].first - a[i], t1[i].second).first, make_pair(t1[i].first - a[i], t1[i].second).second);54 }55 sort(t2[i].begin(), t2[i].end());56 double sum = a[i];57 for(j = t2[i].size() - 1; j >= 0; --j) {58 t3.push_back(make_pair((sum + t2[i][j].first) / sum, t2[i][j].second));59 sum += t2[i][j].first;60 }61 }62 sort(t3.begin(), t3.end());63 /*for(i = t3.size() - 1; i >= 0; --i)64 printf("t3 %f %d\n", t3[i].first, t3[i].second);*/65 66 m = min(m, (int)t3.size());67 for(i = t3.size() - 1; i >= (int)t3.size() - m; --i) {68 sol.push_back(make_pair(t[t3[i].second][0], t3[i].second));69 }70 sort(sol.begin(), sol.end());71 printf("%d\n", m);72 if(m) {73 printf("%d", sol[0].second);74 for(i = 1; i <= m - 1; ++i) {75 printf(" %d", sol[i].second);76 }77 printf("\n");78 }79 }

 

转载于:https://www.cnblogs.com/AC-Phoenix/p/4321914.html

你可能感兴趣的文章
php match_model的简单使用
查看>>
在NT中直接访问物理内存
查看>>
Intel HEX 文件格式
查看>>
SIP服务器性能测试工具SIPp使用指导(转)
查看>>
回调没用,加上iframe提交表单
查看>>
(安卓)一般安卓开始界面 Loding 跳转 实例 ---亲测!
查看>>
Mysql 索引优化 - 1
查看>>
LeetCode(3) || Median of Two Sorted Arrays
查看>>
大话文本检测经典模型:EAST
查看>>
待整理
查看>>
一次动态sql查询订单数据的设计
查看>>
C# 类(10) 抽象类.
查看>>
Vue_(组件通讯)子组件向父组件传值
查看>>
jvm参数
查看>>
我对前端MVC的理解
查看>>
Silverlight实用窍门系列:19.Silverlight调用webservice上传多个文件【附带源码实例】...
查看>>
2016.3.31考试心得
查看>>
mmap和MappedByteBuffer
查看>>
Linux的基本操作
查看>>
转-求解最大连续子数组的算法
查看>>