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的更多相关文章
随机推荐
- jdbc知识点(连接mysql)
jdbc连接mysql 1.JDBC简介 JDBC: 指 Java 数据库连接,是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库.从根本上来说,JDBC ...
- JavaScript实现,控制一个文本框只能输入正整数,如输入不符合条件则文本框全部字体标红
腾讯2014年研发职位笔试题Web前端方向简单题第一题. 代码: <html> <head> <title>test JavaScript</title> ...
- 微信开发之web开发者工具
web开发者工具. 有任何疑问或建议请私信我,或者在评论区大家一起探讨. 概述 为帮助开发者更方便.更安全地开发和调试基于微信的网页,我们推出了 web 开发者工具.它是一个桌面应用,通过模拟微信客户 ...
- docker学习笔记(总纲)
阿里容器Docker简介 什么是Docker 为什么要用Docker 基本认识 Docker EE/Docker CE简介与版本规划 镜像 容器 仓库 数据卷 阿里容器服务的基本概念与其它名词解释 C ...
- 2018-9-4-Roslyn-通过-nuget-统一管理信息
title author date CreateTime categories Roslyn 通过 nuget 统一管理信息 lindexi 2018-09-04 08:55:19 +0800 201 ...
- HZOJ 方程的解
乍一看还以为是道水题,没想到这玩意这么难搞. 看题显然是exgcd,然而exgcd求的是一个解而不是解的个数(考试的时候不记得通解的式子然后挂了). 对于40%的数据,直接枚举计数即可. 对于另为20 ...
- jasperReports 通过java导出各种格式报表,及javaweb项目整合显示各种报表
注意:编写此项目时,请先手动编写**.jrxml 或者用IReport生成**.jrxml或**.jasper 注:java导出报表与web项目显示报表方法其实是相同的,只不过有一句代码不同,如下 ...
- 3d爱心代码
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...
- laravel5 怎么获取数组形式的数据
当构建 JSON API 时,您可能常常需要把模型和关联对象转换成数组或JSON.所以Eloquent里已经包含了这些方法.要把模型和已载入的关联对象转成数组,可以使用 toArray方法: $use ...
- 2018-2-13-C#-枚举转字符串
title author date CreateTime categories C# 枚举转字符串 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:23:3 ...