题目链接:http://codeforces.com/contest/161/problem/B

题意:

    有n个商品和k辆购物车,给出每个商品的价钱c和类别t(1表示凳子,2表示铅笔),如果一辆购物车中有凳子,那么这辆购物车中最便宜的那个物品的价格能减少50%,问你如何放这些物品才能使总价钱最少。

思路:

    简单贪心,判断凳子数量是否大于等于k行。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 typedef pair <LL, int> P;
 5 const int N = 1005;
 6 LL a[N];
 7 P val[N], val2[N];
 8 LL inf = 1e9 + 7;
 9 vector <int> res[N];
10 int main()
11 {
12     int n, m;
13     scanf("%d %d", &n, &m);
14     int pos = 0, pos2 = 0, c;
15     for(int i = 1; i <= n; ++i) {
16         scanf("%lld %d", a + i, &c);
17         if(c == 2) {
18             val2[++pos2].first = a[i];
19             val2[pos2].second = i;
20         } else {
21             val[++pos].first = a[i];
22             val[pos].second = i;
23         }
24     }
25     sort(val + 1, val + pos + 1);
26     sort(val2 + 1, val2 + pos2 + 1);
27     double ans = 0;
28     int f = 0;
29     if(pos >= m) {
30         int i, j;
31         for(i = pos, j = m - 1; j; --i, --j) {
32             ans += val[i].first * 1.0 / 2;
33             res[++f].push_back(val[i].second);
34         }
35         ++f;
36         for(; i >= 2; --i) {
37             ans += val[i].first;
38             res[f].push_back(val[i].second);
39         }
40         for(i = pos2; i > 1; --i) {
41             ans += val2[i].first;
42             res[f].push_back(val2[i].second);
43         }
44         if((val[1].first >= val2[1].first && pos2)) {
45             ans += val[1].first;
46             ans += val2[1].first*1.0 / 2;
47             res[f].push_back(val[1].second);
48             res[f].push_back(val2[1].second);
49         } else if(pos2) {
50             ans += val2[1].first;
51             ans += val[1].first*1.0 / 2;
52             res[f].push_back(val2[1].second);
53             res[f].push_back(val[1].second);
54         } else {
55             ans += val[1].first*1.0 / 2;
56             res[f].push_back(val[1].second);
57         }
58     } else {
59         for(int i = pos; i; --i) {
60             ans += val[i].first * 1.0 / 2;
61             res[++f].push_back(val[i].second);
62         }
63         int i, j;
64         for(i = pos2, j = pos + 1; i && j <= m; --i, ++j) {
65             ans += val2[i].first;
66             res[++f].push_back(val2[i].second);
67         }
68         for(; i; --i) {
69             ans += val2[i].first;
70             res[f].push_back(val2[i].second);
71         }
72     }
73     printf("%.1f\n", ans);
74     for(int i = 1; i <= m; ++i) {
75         printf("%d ", res[i].size());
76         for(int j = 0; j < res[i].size(); ++j) {
77             printf("%d%c", res[i][j], j == res[i].size() - 1? '\n': ' ');
78         }
79     }
80     return 0;
81 }

转载于:https://www.cnblogs.com/Recoder/p/5938140.html

Codeforces 161 B. Discounts (贪心)相关推荐

  1. 【Codeforces】158B-Taxi(贪心,怎么贪咧)

         贪心   emmmm http://codeforces.com/contest/158/problem/B 题目大意:有四种旅客,四人一组,三人一组,两人一组,一人一组,一辆出租车最多可以 ...

  2. CodeForces - 1607D Blue-Red Permutation(贪心)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的数列,每个数字有一个颜色,如果是蓝色,每次操作则可以减一:如果是红色,每次操作则可以加一. 问有限次操作后,能否将数组变为一个长度为 nnn 的 ...

  3. CodeForces - 1481E Sorting Books(贪心+dp)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,每次操作可以将任意一本书放到序列的末尾,问最少需要操作多少次,才能使得相同的数字挨在一起 题目分析:不难看出,对每个位置的数都操作一次,是 ...

  4. CodeForces 176A Trading Business 贪心

    Trading Business 题目连接: http://codeforces.com/problemset/problem/176/A Description To get money for a ...

  5. codeforces 735C Tennis Championship(贪心+递推)

    Tennis Championship 题目链接:http://codeforces.com/problemset/problem/735/C --每天在线,欢迎留言谈论. 题目大意: 给你一个 n ...

  6. codeforces 1203 E Boxers 贪心

    https://codeforces.com/problemset/problem/1203/E 题目大意:给 n n n个数,每个数可以做两种变化:(1) + 1 +1 +1:(2) − 1 -1 ...

  7. Codeforces 854 C Planning 贪心 最大堆

    题目链接: https://vjudge.net/problem/CodeForces-854C 题目描述: 有n架飞机,第i架飞机原本计划在第i分钟起飞,可是由于某种原因整个机场前k分钟是不能起飞的 ...

  8. CodeForces - 967D Resource Distribution(贪心+二分+构造)

    题目链接:点击查看 题目大意:给出 n 个机器,每个机器可以处理 a[ i ] 的工作,现在有两个工作需要处理,工作量分别为 x1 和 x2,可以将一个工作分配给 k 个机器同时完成,需要满足: k ...

  9. CodeForces - 1323C Unusual Competitions(贪心)

    题目链接:点击查看 题目大意:给出一个长度为 n 的括号序列,现在允许的操作是对于一段区间 [ l , r ] 内的括号重新排列,所需要的花费为区间长度,问如果想要使得括号序列变为正确的形式,最少花费 ...

最新文章

  1. python3操作MySQL:insert插入数据
  2. boost::multiprecision模块cpp_dec_float_100相关的测试程序
  3. Apache的配置详解
  4. 没有到主机的路由_网络基础知识:TCP协议之跟踪路由
  5. python if else elif_Python之 if-elif-else
  6. 探测能源、跨洲安全通信……你所想不到的量子技术!
  7. 白盒测试工具CodeTest
  8. VC2005 运行库解析
  9. VS连接SQL Server 2008,并实现登录和注册功能
  10. Mac: Mac 截长屏
  11. maven打包报错scalac error: xxxx\target\classes does not exist or is not a director
  12. 疫苗预约系统,疫苗接种管理系统,疫苗预约管理系统毕设作品
  13. 同济高等数学第三章之经典错误知识点笔记
  14. TCHAR char
  15. 一次性免费临时邮箱,专注个人隐私保护
  16. new操作符做了哪些事情?
  17. Java编程语言的8大优势
  18. Office2019专业版从下载到安装、使用
  19. Android 12.0 开机动画支持mp4格式视频播放
  20. 燃气 CAD 施工图入库 ArcGIS 系统求助

热门文章

  1. 虚拟化技术 — 硬件辅助的虚拟化技术
  2. 【设计模式】工厂模式的作用?工厂模式有什么优点?
  3. Java设计原则之单一职责原则、开闭原则、里氏代换原则
  4. RISC V (RV32+RV64) 架构 整体介绍
  5. 服务器显示idc,知道一个IP,怎么查询这个服务器是哪家IDC提供的?
  6. 阿里quickbi、观远报表平台以及tableau的使用
  7. STM32F030 IIC2通用读写24C02、24C16、24C32、24C64等例程
  8. yyds,Win10真香!!!
  9. 深入理解String.intern
  10. 富受贿数额为45437元