CF161BDiscounts
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的更多相关文章
随机推荐
- 运行docker容器镜像2(指定容器启动时启动的脚本)
docker中启动容器有以下两种情况. 第一种是通过 # docker run containerid 启动一个容器. 第二种是重新启动已经关闭的容器. # docker start containe ...
- python 并发之进程
一.什么是进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实 ...
- Spring Data JPA 查询结果返回至自定义实体
本人在实际工作中使用Spring Data Jpa框架时,一般查询结果只返回对应的Entity实体.但有时根据实际业务,需要进行一些较复杂的查询,比较棘手.虽然在框架上我们可以使用@Query注解执行 ...
- javascript导图 标签: javascript 2015-12-06 16:37 721人阅读 评论(24)
- ORACLE学习笔记-ORACLE(基本命令)
--查看VGA信息: show sga; select * from v$sgastat;--可以通过以下几个动态性能视图查看信息: V$sysstat 系统统计信息 V ...
- docfx 做一个和微软一样的文档平台
开发中,有一句话叫 最不喜欢的是写文档,最不喜欢的是看别人家代码没有文档.那么世界上文档写最 la 好 ji 的就是微软了,那么微软的api文档是如何做的?难道请了很多人去写文档? 实际上微软有工具用 ...
- 模板—树上倍增LCA
int LCA(int x,int y) { if(x==y)return x; if(dep[x]>dep[y])swap(x,y); while(dep[x]<dep[y]) ;;i+ ...
- 注意 Laravel 清除缓存 php artisan cache:clear 的一个坑
Laravel 的命令 php artisan cache:clear 用来清除各种缓存,如页面,Redis,配置文件等缓存,它会清空 Redis 数据库的全部数据,比如默认使用的 Redis 的 数 ...
- day2_python之字符编码
一 .计算机基础知识 二.文本编辑器存取文件的原理(nodepad++,pycharm,word) #1.打开编辑器就打开了启动了一个进程,是在内存中的,所以,用编辑器编写的内容也都是存放与内存中的, ...
- python selenium 测试配置信息(URL和浏览器)
config.ini # this is config file, only store browser type and server URL [browserType] #browserName ...