C - Bolero

Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u

Description

Winter in Yekaterinburg is the longest time of the year. And everyone spends long winter evenings in his own way. Denis is a big fan of classical music, at least twice a week he attends concerts at the Philharmonic.
This year, Denis wants to buy tickets for the whole season at once and even already has chosen a list of concerts, which he wants to attend. Now, he thinks, how to buy tickets. There is an opportunity in the Philharmonic to choose any k or more concerts and to buy a single subscription for all of them. The cost of this subscription will be equal to the total cost of all concerts in it but with a discount ppercent. There are many types of such subscriptions, with different k and p. In addition, for some concerts Denis, as a student, has a discount. This discount is valid only if he buys the ticket separately, outside the subscription.
Denis, like any other poor student, wants to attend all the concerts, spending as little money as possible. However, he knows that there are always more people wanting to attend a concert than the number of seats in the Philharmonic hall. So he will not buy more than one ticket for one concert (separately or in a subscription), even if it allows him to save money.

Input

The first line contains integers n and m that are the number of concerts Denis wants to attend, and a number of different subscription types at the Philharmonic (2 ≤ n ≤ 10 5; 1 ≤ m ≤ 10 5). The i-th of the following n lines contains integers si and di that are the price of a ticket and the discount for students in percent at the i-th concert (100 ≤ si ≤ 50 000; 0 ≤ di ≤ 100). The  j-th of the following m lines contains integers kj and pj that are the minimum number of concerts that can be combined in the subscription of the j-th type, and a discount for it in percent (2 ≤ kj ≤ n; 1 ≤ pj ≤ 100).

Output

Output the minimum amount of money Denis has to spend to attend all the concerts. The answer should be given with an absolute or relative error not exceeding 10 −6.

Sample Input

input output
6 2
500 0
700 0
300 0
400 0
500 50
800 0
5 10
6 15
2680.00

Notes

In the example, Denis needs to buy a subscription of the first type (with 10% discount) for all concerts, except the fifth one, and to buy a ticket for the fifth concert with a student discount of 50%.
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
typedef long long ll; #define MM(a,b) memset(a,b,sizeof(a));
#define inf 0x7f7f7f7f
#define FOR(i,n) for(int i=1;i<=n;i++)
#define CT continue;
#define PF printf
#define SC scanf
const int maxn=100000+10; struct node{
ll val;int id;
bool operator<(const node &a) const{
return this->val>a.val;
}
};
vector<int> G[105];
priority_queue<node> q;
int num[105],g[105];
int main()
{
int n,m;
while(~SC("%d%d",&n,&m)){
ll ori=0,ans=0;
for(int i=0;i<=100;i++) G[i].clear();
FOR(i,n) {
int cost,p;
SC("%d%d",&cost,&p);
ori+=cost*(100-p);
G[p].push_back(cost);
}
for(int i=0;i<=100;i++) sort(G[i].begin(),G[i].end());
MM(num,inf);
FOR(i,m){
int peo,dis;
SC("%d%d",&peo,&dis);
num[dis]=min(num[dis],peo);
}
// PF("111111\n");
ans=ori;
FOR(k,100){
if(num[k]>n) CT;
MM(g,0);
// PF("2222222\n");
ll tmp=ori,cnt=0;
for(int i=0;i<=k;i++)
for(int j=0;j<G[i].size();j++){
tmp+=G[i][j]*(i-k);cnt++;
}
// PF("3333333\n");
while(q.size()) q.pop();
for(int i=k+1;i<=100;i++) {
if(G[i].size()) q.push((node){G[i][0]*(i-k),i});
g[i]=1;
}
// PF("444444\n");
while(cnt<num[k]){
node u=q.top();q.pop();
tmp+=u.val;
cnt++;
if(g[u.id]<G[u.id].size()){
int r=g[u.id];
q.push((node){G[u.id][r]*(u.id-k),u.id});
g[u.id]++;
}
}
ans=min(ans,tmp);
}
PF("%.2f\n",(double)ans/100.00);
}
return 0;
}

  错点:如果直接枚举优惠券的优惠值大小k(0-100),然后,计算出每种票在此优惠券下的可优惠

价格,再sort排下序是100*1e5*log1e5是会超时的,所以需要优化一下,考虑买单个票的时候,打的折

<=k的必须要算(可优惠),对于>k的,对每种k,每次都只能选其中的一种(贪心),所以,可用优先队列将复杂度降到1e5log100,

注意==k的也必须要贪啊,,因为要让大与k的数量尽可能小

URAL 2092 Bolero 贪心的更多相关文章

  1. D - Binary Lexicographic Sequence URAL - 1081 (贪心)

    题目链接:https://cn.vjudge.net/contest/275079#problem/D 具体思路:首先,我们可以观察到1-n位数的种数连起来是一个很有规律的数列,然后我们开始倒序建立. ...

  2. 贪心 URAL 1303 Minimal Coverage

    题目传送门 /* 题意:最少需要多少条线段能覆盖[0, m]的长度 贪心:首先忽略被其他线段完全覆盖的线段,因为选取更长的更优 接着就是从p=0开始,以p点为标志,选取 (node[i].l < ...

  3. ural 1303 Minimal Coverage【贪心】

    链接: http://acm.timus.ru/problem.aspx?space=1&num=1303 http://acm.hust.edu.cn/vjudge/contest/view ...

  4. URAL 2019 Pair: normal and paranormal (贪心) -GDUT联合第七场

    比赛题目链接 题意:有n个人每人拿着一把枪想要杀死n个怪兽,大写字母代表人,小写字母代表怪兽.A只能杀死a,B只能杀死b,如题目中的图所示,枪的弹道不能交叉.人和怪兽的编号分别是1到n,问是否存在能全 ...

  5. ural 1303 Minimal Coverage(贪心)

    链接: http://acm.timus.ru/problem.aspx?space=1&num=1303 按照贪心的思想,每次找到覆盖要求区间左端点时,右端点最大的线段,然后把要求覆盖的区间 ...

  6. URAL 1203 Scientific Conference dp?贪心

    题目:click here 分明就是贪心怎么会在dp的专题 #include <bits/stdc++.h> using namespace std; typedef unsigned l ...

  7. URAL 1203 Scientific Conference(贪心 || DP)

    Scientific Conference 之前一直在刷计算几何,邀请赛连计算几何的毛都买见着,暑假这一段时间就做多校.补多校的题目.刷一下一直薄弱的DP.多校假设有计算几何一定要干掉-.- 题意:给 ...

  8. URAL 1995 Illegal spices 贪心构造

    Illegal spices 题目连接: http://acm.timus.ru/problem.aspx?space=1&num=1995 Description Jabba: Han, m ...

  9. URAL 2021 Scarily interesting! (贪心+题意)

    题意:给定两个队伍的每个人的得分,让你安排怎么比赛才能使得观众知道冠军的时间最长. 析:贪心,很简单,就是先开始总分高的先出最差劲的,总分低的先出最厉害的,这个题当时实在是读的不明白啊,WA了好多次. ...

随机推荐

  1. SSD目标检测实战(TF项目)——人脸检测2

    数据转化为VOC格式: 一.我们先看 VOC格式的数据是什么??? Annotations:存放xml 包括 文件夹信息   图片名称. 图片尺寸信息. 图片中object的信息. JPEGImage ...

  2. OVS+Docker

    两台机器操作一样就是IP不同但是设置都是相同的: A机器:192.168.71.142 docker0:172.17.42.1 B机器:192.168.71.136 docker0:172.17.43 ...

  3. 并不对劲的CF1237D&E:Balanced Playlist and Binary Search Trees

    CF1237D Balanced Playlist 题意 有一个长度为\(n\)(\(n\leq 10^5\))的循环播放歌单,每首歌有一个优秀值\(a_i\)(\(a_i\leq 10^9\)). ...

  4. 进阶Java编程(2)线程常用操作方法

    线程常用操作方法 多线程的主要操作方法都在Thread类中定义的. 1,线程的命名和取得 多线程的运行状态是不确定的,那么在程序的开发之中为了可以获取到一些需要使用到的线程就只能依靠线程的名字来进行操 ...

  5. vs2013nuget版本更新

    记录记录. NuGet 程序包还原失败: “Newtonsoft.Json 12.0.1”程序包需要 NuGet 客户端版本“2.12”或更高版本,但当前的 NuGet 版本为“2.7.40911.2 ...

  6. 如何使用Navicat 创建一个SqlServer定时任务

    因为网上资料不全,所以自己琢磨了一上午,终于弄出来了,记录一下. step1: 右击[函数]选择[新建函数]添加一个存储过程 step2: 选择[过程],点击下一步直至完成,然后编辑存储过程,保存 s ...

  7. JS基础_属性名和属性值

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. O064、NFS Volume Provider(Part III)

    参考https://www.cnblogs.com/CloudMan6/p/5702199.html   今天我们将前一小节中创建的 nfs-vol-xx attach 到Instance c1 上, ...

  9. Typora入门:全网最全教程

    目录 简介 Markdown介绍 常用快捷键 块元素 换行符 标题级别 引用文字 无序列表 有序列表 任务列表 代码块 数学表达式 插入表格 脚注 分割线 目录(TOC) 跨度元素 链接 网址 图片 ...

  10. javascript头像上传

    上传头像: 相关关键词:ondragover(拖动元素在投放区内移动) ondrop (元素放在投放区触发但是要去处理浏览器默认事件的影响:ondragenter.ondragover) dataTr ...