Codeforces B. Too Easy Problems
题目描述:
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
You are preparing for an exam on scheduling theory. The exam will last for exactly T milliseconds and will consist of n problems. You can either solve problem i in exactly ti milliseconds or ignore it and spend no time. You don't need time to rest after solving a problem, either.
Unfortunately, your teacher considers some of the problems too easy for you. Thus, he assigned an integer ai to every problem i meaning that the problem i can bring you a point to the final score only in case you have solved no more than ai problems overall (including problem i).
Formally, suppose you solve problems p1, p2, ..., pk during the exam. Then, your final score s will be equal to the number of values of jbetween 1 and k such that k ≤ apj.
You have guessed that the real first problem of the exam is already in front of you. Therefore, you want to choose a set of problems to solve during the exam maximizing your final score in advance. Don't forget that the exam is limited in time, and you must have enough time to solve all chosen problems. If there exist different sets of problems leading to the maximum final score, any of them will do.
Input
The first line contains two integers n and T (1 ≤ n ≤ 2·105; 1 ≤ T ≤ 109) — the number of problems in the exam and the length of the exam in milliseconds, respectively.
Each of the next n lines contains two integers ai and ti (1 ≤ ai ≤ n; 1 ≤ ti ≤ 104). The problems are numbered from 1 to n.
Output
In the first line, output a single integer s — your maximum possible final score.
In the second line, output a single integer k (0 ≤ k ≤ n) — the number of problems you should solve.
In the third line, output k distinct integers p1, p2, ..., pk (1 ≤ pi ≤ n) — the indexes of problems you should solve, in any order.
If there are several optimal sets of problems, you may output any of them.
Examples
input
5 300
3 100
4 150
4 80
2 90
2 300
output
2
3
3 1 4
input
2 100
1 787
2 788
output
0
0
input
2 100
2 42
2 58
output
2
2
1 2
Note
In the first example, you should solve problems 3, 1, and 4. In this case you'll spend 80 + 100 + 90 = 270 milliseconds, falling within the length of the exam, 300 milliseconds (and even leaving yourself 30 milliseconds to have a rest). Problems 3 and 1 will bring you a point each, while problem 4 won't. You'll score two points.
In the second example, the length of the exam is catastrophically not enough to solve even a single problem.
In the third example, you have just enough time to solve both problems in 42 + 58 = 100 milliseconds and hand your solutions to the teacher with a smile.
思路:
刚开始:觉得应该用贪心,但具体怎么做不清楚,只是单纯的用qsort把结构体数组先按a这个属性从小到大排序,若a相同,将时间按从大到小排序
样例1排序结果如下:
2 2 3 4 4
300 90 100 150 80
然后怎么贪心呢?先是胡思乱想,想的是从后往前,只要时间够,就加到答案里,时间不够就跳过该数,可显然不对,过了十几个样例(惊了)后终于卡住。问题出在哪?发现这个算法就是只要时间够就往上加,导致与题目的要求完全不符。那题目的意思是?
是在总时间的限制条件下,从数组中找有效元素,有效元素越多越好。有效元素就是最后找到的元素个数k要小于等于该元素的a属性值。k越大,导致对有效元素的要求越高(a要越大),最后的平衡点就是最值点。
依照上面刚开始的思路,平衡点之后可以看到在增加元素的个数是没有意义的,因为a值不会增加(已排好序)
那么该怎么做?
此处用到优先队列,类似于上面排好序的结构体数组,不过更为方便,因为是基于堆的实现。再利用二维向量,在读入数据时将a值相同的元素(ind,time)存到二维向量的一个向量中。因为题目要求分数(score)最大,i从n开始枚举,一直减少到0.
对于每个i值,代表想办法把当前情况下的分数弄到i上。将vector中的ai==i的哪一列全部加入优先队列中,再判断,如果元素多了,代表不考虑总是见的情况下,把分数弄到i是可能的。就pop出用时最大的元素,直到数量上得以满足i个有效元素;如果元素不够,说明凑不出分数为i的情况。接着判断队列中元素个数是否为i且总时间满足限制。若满足,那么分数为i的情况凑出来啦,跳出循环,可以输出答案。如果不满足,i--,看下一轮凑不凑得出分数为i的情况,直到答案或0.
知识点:priority_queue
struct node
{
int x,y;
bool operator < (const node & a) const
{
return x<a.x;
}
};
priority_queue <node> q;
priority_queue <int,vector<int>,less<int> > p;
priority_queue <int,vector<int>,greater<int> > q;
代码:
#include <iostream>
#include <vector>
#include <queue>
#define max_n 200005
using namespace std;
vector<pair<int,int> > vec[max_n];
struct node
{
int id;
int time;
friend bool operator<(node a,node b)
{
return a.time<b.time;
}
}; priority_queue<node> que;
int n;
int T;
int main()
{
cin >> n >> T;
for(int i = ;i<n;i++)
{
int num,time;
cin >> num >> time;
vec[num].push_back(pair<int,int>(time,i));
}
int sum = ;
int score = ;
for(int i = n;i>=;i--)
{
for(int j = ;j<vec[i].size();j++)
{
node p;
p.id = vec[i][j].second+;
p.time = vec[i][j].first;
que.push(p);
sum += p.time;
}
while(que.size()>i)
{
int t= que.top().time;
que.pop();
sum -= t;
}
score = i;
if(que.size()==i&&sum<=T)
{
break;
}
} cout << que.size() << endl;
cout << score << endl;
while(que.size())
{
cout << que.top().id << " ";
que.pop();
}
return ;
}
Codeforces B. Too Easy Problems的更多相关文章
- Codeforces 913D - Too Easy Problems
913D - Too Easy Problems 思路:二分check k 代码: #include<bits/stdc++.h> using namespace std; #define ...
- 【CodeForces】913 D. Too Easy Problems
[题目]D. Too Easy Problems [题意]给定n个问题和总时限T,每个问题给定时间ti和限制ai,当解决的问题数k<=ai时问题有效,求在时限T内选择一些问题解决的最大有效问题数 ...
- 解题:AT2064 Many Easy Problems&EXNR #1 T3 两开花
题面 两道题比较像,放在一起写了,后者可以看成前者的加强版 (sto ztb orz) 先看AT那道题 考虑计算每个点的贡献,用容斥计算:每个点没有贡献当且仅当选的所有点都在以他为根时的一个子节点的子 ...
- 【AtCoder】AGC005 F - Many Easy Problems 排列组合+NTT
[题目]F - Many Easy Problems [题意]给定n个点的树,定义S为大小为k的点集,则f(S)为最小的包含点集S的连通块大小,求k=1~n时的所有点集f(S)的和取模92484403 ...
- AtcoderGrandContest 005 F. Many Easy Problems
$ >AtcoderGrandContest \space 005 F. Many Easy Problems<$ 题目大意 : 有一棵大小为 \(n\) 的树,对于每一个 \(k \i ...
- codeforces 727F. Polycarp's problems
题目链接:http://codeforces.com/contest/727/problem/F 题目大意:有n个问题,每个问题有一个价值ai,一开始的心情值为q,每当读到一个问题时,心情值将会加上该 ...
- 【AGC 005F】Many Easy Problems
Description One day, Takahashi was given the following problem from Aoki: You are given a tree with ...
- D. Too Easy Problems
链接 [http://codeforces.com/group/1EzrFFyOc0/contest/913/problem/D] 题意 给你n个题目,考试时间T,对于每个问题都有一个ai,以及解决所 ...
- AtCoder - 2064 Many Easy Problems
Problem Statement One day, Takahashi was given the following problem from Aoki: You are given a tree ...
随机推荐
- ros 源码安装
版本lunar, 系统版本debian 9.8 参考: http://wiki.ros.org/lunar/Installation/Source 1. Installing bootstrap de ...
- phpspreadsheet 中文文档(三) 计算引擎
2019年10月11日13:59:52 使用PhpSpreadsheet计算引擎 执行公式计算 由于PhpSpreadsheet表示内存中的电子表格,因此它还提供公式计算功能.单元格可以是值类型(包含 ...
- 破解MySQL登录密码的几种方法
工具列表 Medusa Ncrack Hydra Metasploit Medusa medusa -h 192.168.1.106 –U /root/Desktop/user.txt –P /ro ...
- Apache Kafka® is a distributed streaming platform
Kafka Connect简介 我们知道过去对于Kafka的定义是分布式,分区化的,带备份机制的日志提交服务.也就是一个分布式的消息队列,这也是他最常见的用法.但是Kafka不止于此,打开最新的官网. ...
- xe.10.2的下载路径
为了这个玩意,我折腾了一天,为了以后自己还用到 官网地址: http://altd.embarcadero.com/download/radstudio/10.2/delphicbuilder10_2 ...
- php数组到json的转变
今天做项目遇到个问题,一个接口,输出二维数组,前端说他要的数据格式是数组,而不是对象,就像上个数据一样,我当时就懵逼了,,,什么对象?我明明输出的是数组啊...然后我看了看我返回的json串,emmm ...
- collections模块之defaultdict()与namedtuple()方法简单介绍
一.defaultdict() 作用:根据数据创建字典时,需要为一些数据生成字典,而且对值得类型进行限定的时候,考虑defaultdict from collections import defaul ...
- Python使用Django创建第一个项目
一 必要环境安装 1首先确保安装了Python3,在此使用的系统为Ubuntu @ubuntu:~$ python3 Python 3.6.7 (default, Oct 22 2018, 11:32 ...
- 过滤器 & 监听器 & 拦截器
过滤器: https://blog.csdn.net/MissEel/article/details/79351231 https://blog.csdn.net/qq_32363305/articl ...
- Java 中 Hashtable与HashMap的区别
Map Map是一个以键值对存储的接口.Map下有两个具体的实现,分别是HashMap和HashTable. 区别: 1.HashMap是线程非安全的,HashTable是线程安全的,所以HashMa ...