您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: