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. No.4 Verilog 表达式

    4-1 操作数 常数.参数.线网.变量.位选.存储器.数组. *部分位选: integer mark; :] inst; :] gpio; inst[mark+ : ] //选择 mark,mark+ ...

  2. Emacs用JDEE编写Android程序

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/sheismylife/article/details/24842669 前文介绍了怎样用Maven构 ...

  3. python 初始化init方法

  4. python 通过.pth文件修改搜索路径

  5. IIS 设置 FTP 服务器 添加多个账户

    我们有很多童鞋经常开不动IIS自带的FTP如何创建,就算创建了也不会实现多用户,下面我来分享一下我的经验吧: 使用 IIS 设置 FTP 服务器 依次单击“开始”按钮.“控制面板”和“添加或删除程序” ...

  6. MaxCompute 项目子账号做权限管理

    场景: 一个企业使用多款阿里云产品,MaxCompute是其中一个产品,用的是同个主账号,主账号不是由使用MaxCompute的大数据同学管理,  大数据同学使用的是子账号.大数据同学日常需要给Max ...

  7. 【Linux】vim缩进配置 (转载)

    1.安装vim,终端输入: wanpeng@ubuntu:~$ sudo apt-get install vim-full 2.终端输入,打开配置文件: wanpeng@ubuntu:~$ vim ~ ...

  8. WPF 线段Line过长渲染出现的问题

    原文:WPF 线段Line过长渲染出现的问题 在使用WPF的时候,可以做一个实验,在canvas里添加一条线段Line,StrokeThickness属性设置为1,然后通过放大canvas或者调整li ...

  9. 【牛腩视频】之SQL触发器 标签: 数据库 2015-05-23 09:44 1339人阅读 评论(40) 收藏

    之前在学习机房管理系统.net版的时候,已经写过了关于数据库的操作,但是现在开始学习牛腩,才发现之前自己理解的太浅显,很多东西看似好像会了,不去实际操作一下,不把代码从头到尾敲出来,到头来还是不会,所 ...

  10. 洛谷P1510 精卫填海

    //01背包 求背包内物品价值超过某一定值时的最小体积 #include<bits/stdc++.h> using namespace std; ; ; int n,v_tot,w_tot ...