CF161B

题目大意;要购买\(n\)件物品,有\(A\)\(B\)两种类型,要求分成\(k\)组,其中如果其中一组含有\(A\)类物品,那么这一组最便宜的一件物品就会半价

怎么分组最小化代价?

我们应该尽量优惠的幅度尽量大

对于一个\(A\)类物品,假设他的价格为\(w\),那么我们绝对不会选择价值比它更小的,因为这样会让我们优惠的代价变小

我们选择贵的又对优惠的价格没有影响,所以

我们能够选择一个比较优的分组方案

先按照价格排序

把最贵的前\(k\)个A(不足\(k\)个就全部)分成一组

然后如果不够组数,就把剩下的尽量补全\(k\)组,然后把每个\(A\)类塞到小于他的最大的\(A\)的那组,如果不存在这样的\(A\),就塞到最后一组

来保证优惠价格的最大化

#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<cctype>
#include<vector>
#include<ctime>
#define LL long long
#define pii pair<int,int>
#define mk make_pair
#define fi first
#define se second
using namespace std;
const int N = 2e5 + 3;
inline int read(){
int v = 0,c = 1;char ch = getchar();
while(!isdigit(ch)){
if(ch == '-') c = -1;
ch = getchar();
}
while(isdigit(ch)){
v = v * 10 + ch - 48;
ch = getchar();
}
return v * c;
}
struct node{
int ti;
int ci;
int id;
}a[N];
bool book[N],used[N];
vector <int> G[N];
int n,k;
double ans;
inline bool cmp(node x,node y){
return x.ci > y.ci;
}
inline bool cmpp(node x,node y){
return x.id < y.id;
}
int main(){
int sum = 0,cnt;
n = read(),k = read();
for(int i = 1;i <= n;++i){
a[i].ci = read(),a[i].ti = read(),sum += (a[i].ti == 1);
a[i].id = i;
}
sort(a + 1,a + n + 1,cmp);
int need = max(0,k - sum),now = 1;
for(int i = 1;i <= n;++i){
if(a[i].ti == 1){
book[now] = 1;
if(now < k) G[now++].push_back(a[i].id);
else G[now].push_back(a[i].id);
}
else{
if(need && now < k) G[now++].push_back(a[i].id),need--;
else G[now].push_back(a[i].id);
}
}
sort(a + 1,a + n + 1,cmpp);
for(int i = 1;i <= now;++i){
for(int j = 0;j < (int)G[i].size();++j){
if(j == G[i].size() - 1 && book[i]) ans += (double)a[G[i][j]].ci * 0.5;
else ans += a[G[i][j]].ci;
}
}
printf("%.1lf\n",ans);
for(int i = 1;i <= now;++i){
printf("%d ",G[i].size());
for(int j = 0;j < (int)G[i].size();++j) printf("%d ",G[i][j]);
putchar('\n');
}
return 0;
}

CF161BDiscounts的更多相关文章

随机推荐

  1. 简单的requestAnimationFrame动画

    html部分 <div id="test" style="width:1px;height:17px;background:#0f0;">0%< ...

  2. 洛谷 P3951 小凯的疑惑 找规律

    目录 题面 题目链接 题目描述 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例: 输出样例: 说明 思路 证明 AC代码 include<bits/stdc++.h> 题面 ...

  3. 详解composer的自动加载机制

    composer是一个用PHP开发的用来管理项目依赖的工具,当你在项目中声明了依赖关系后,composer可以自动帮你下载和安装这些依赖库,并实现自动加载代码. 安装composer composer ...

  4. 2016中国银行Top100榜单发布 工行排首位

    2016中国银行Top100榜单发布 工行排首位 2016-07-09 15:13:19 第一财经   2016年7月8日,中国银行业协会在京召开“<中国银行业发展报告(2016)>发布会 ...

  5. 微信开发之web开发者工具

    web开发者工具. 有任何疑问或建议请私信我,或者在评论区大家一起探讨. 概述 为帮助开发者更方便.更安全地开发和调试基于微信的网页,我们推出了 web 开发者工具.它是一个桌面应用,通过模拟微信客户 ...

  6. C++之ARX,Acstring,ACahr转char

    AcDbText* pText = AcDbText::cast(pEnt); AcString sText = DBHelper::AcStringFree(pText->textString ...

  7. Person Re-identification 系列论文笔记(四):Re-ID done right: towards good practices for person re-identification

    Re-ID done right: towards good practices for person re-identification Almazan J, Gajic B, Murray N, ...

  8. @loj - 2434@ 「ZJOI2018」历史

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 九条可怜是一个热爱阅读的女孩子. 这段时间,她看了一本非常有趣的 ...

  9. tp3 key json 分页

    //json 强制转换为array $arr[$key]['checkpro'] = json_decode($val['checkpro'],JSON_FORCE_ARRAY);    $arr[$ ...

  10. python-----堡垒机前戏paramiko模块及进阶

    堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: i ...