D. Too Easy Problems(二分,排序,贪心)
2018-02-27 22:24
453 查看
题目链接:点击打开链接
题目大意:给出n个问题和总时间t。
给出的n个问题,对于每个问题都有一个限制题数,如果答题数超过了该题的限制题数,该题不得分;以及每道题所需要花费的时间。
现在要求再规定时间内尽可能的拿高分。输出结果不唯一,即顺序不唯一,以及规定时间内做的不得分的题可算可不算。
思路:二分,排序,贪心等思路
对于答题的数量我们可以用二分的方法检验,判断答题数量是否满足。
其次在每个二分过程中,提取所有满足的题目,并对这些题目按照时间的长短有小到大排序,最后检验一下提取出来的题目数量以及总的时间是否符合即可。
复杂度O(nlogn)
#include <bits/stdc++.h>
#include<vector>
using namespace std;
int main()
{
int n, T;
scanf("%d %d", &n, &T);
vector<int> a(n), t(n);
for (int i = 0; i < n; i++)
{
scanf("%d %d", &a[i], &t[i]);
}
vector<int> res;
int low = 0, high = n;
while (low < high)
{
int mid = (low + high + 1) >> 1;
vector< pair<int,int> > e;
for (int i = 0; i < n; i++)
{
if (a[i] >= mid)
{
e.push_back(make_pair(t[i], i));
}
}
sort(e.begin(), e.end());
bool ok = false;
if ((int) e.size() >= mid)
{
int sum = 0;
for (int i = 0; i < mid; i++)
{
sum += e[i].first;
}
if (sum <= T)
{
ok = true;
res.resize(mid);
for (int i = 0; i < mid; i++)
{
res[i] = e[i].second;
}
}
}
if (ok)
{
low = mid;
}
else
{
high = mid - 1;
}
}
int sz = (int) res.size();
printf("%d\n%d\n", sz, sz);
for (int i = 0; i < sz; i++)
{
if (i > 0)
{
putchar(' ');
}
printf("%d", res[i] + 1);
}
printf("\n");
return 0;
}
题目大意:给出n个问题和总时间t。
给出的n个问题,对于每个问题都有一个限制题数,如果答题数超过了该题的限制题数,该题不得分;以及每道题所需要花费的时间。
现在要求再规定时间内尽可能的拿高分。输出结果不唯一,即顺序不唯一,以及规定时间内做的不得分的题可算可不算。
思路:二分,排序,贪心等思路
对于答题的数量我们可以用二分的方法检验,判断答题数量是否满足。
其次在每个二分过程中,提取所有满足的题目,并对这些题目按照时间的长短有小到大排序,最后检验一下提取出来的题目数量以及总的时间是否符合即可。
复杂度O(nlogn)
#include <bits/stdc++.h>
#include<vector>
using namespace std;
int main()
{
int n, T;
scanf("%d %d", &n, &T);
vector<int> a(n), t(n);
for (int i = 0; i < n; i++)
{
scanf("%d %d", &a[i], &t[i]);
}
vector<int> res;
int low = 0, high = n;
while (low < high)
{
int mid = (low + high + 1) >> 1;
vector< pair<int,int> > e;
for (int i = 0; i < n; i++)
{
if (a[i] >= mid)
{
e.push_back(make_pair(t[i], i));
}
}
sort(e.begin(), e.end());
bool ok = false;
if ((int) e.size() >= mid)
{
int sum = 0;
for (int i = 0; i < mid; i++)
{
sum += e[i].first;
}
if (sum <= T)
{
ok = true;
res.resize(mid);
for (int i = 0; i < mid; i++)
{
res[i] = e[i].second;
}
}
}
if (ok)
{
low = mid;
}
else
{
high = mid - 1;
}
}
int sz = (int) res.size();
printf("%d\n%d\n", sz, sz);
for (int i = 0; i < sz; i++)
{
if (i > 0)
{
putchar(' ');
}
printf("%d", res[i] + 1);
}
printf("\n");
return 0;
}
相关文章推荐
- Codeforces Hello 2018 D. Too Easy Problems (二分)
- Hello 2018 D. Too Easy Problems(贪心+优先队列)
- Codeforces 913DToo Easy Problems (优先队列 & 贪心)
- Codeforces 913D - Too Easy Problems(贪心+优先队列)
- D. Too Easy Problems(贪心)
- D. Too Easy Problems(贪心+优先队列)
- 【Hello 2018 D】Too Easy Problems
- Hello 2018 D. Too Easy Problems
- 【Educational Codeforces Round 3 D】【二分答案 贪心排序】Gadgets for dollars and pounds m个物品n天价格买k个的最早天数
- Codeforces 913D - Too Easy Problems
- Codeforces Hello 2018 - D - Too Easy Problems
- HDU5246 超级赛亚ACMer 排序+贪心+二分
- 【CodeForces】913 D. Too Easy Problems
- CodeForces-729C-Road to Cinema(二分查找 贪心 排序)
- “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛题解&&源码【A,水,B,水,C,水,D,快速幂,E,优先队列,F,暴力,G,贪心+排序,H,STL乱搞,I,尼姆博弈,J,差分dp,K,二分+排序,L,矩阵快速幂,M,线段树区间更新+Lazy思想,N,超级快速幂+扩展欧里几德,O,BFS】
- Codeforces 913D - Too Easy Problems 【优先队列】
- 二分查找树转化为排序的循环双链表
- 快速排序和二分查找时间复杂度详解
- [BZOJ3969]WF2013 Low Power|二分答案|贪心
- 【POJ 3122】 Pie (二分+贪心)