D. Too Easy Problems(贪心模拟)

思路:先对时间排序,每次判断当前剩余时间能否加入一个元素。再判断当前选择的元素中有哪些是不符合规则的,全部删去,并返还时间。我用了multiset写了一个简单的堆模拟。

struct node {
	int w;
	int ti;
	int id;
	bool operator<(const node b)const
	{
		if (this->ti == b.ti)return this->w > b.w;
		return this->ti < b.ti;//时间小的
	}
}a[N];
struct node2
{
	int w;
	int ti;
	int id;
	bool operator<(const node2 b)const
	{
		if (this->w == b.w)return this->ti > b.ti;
		return	this->w < b.w;//检索无效的元素
	}
};
int main()
{
	int n, time;
	while (cin >> n >> time)
	{
		multiset<node> st;
		f(i, 1, n) { scanf("%d%d", &a[i].w, &a[i].ti);a[i].id = i;st.insert(a[i]); }
		node2 b;
		multiset<node2> st2;
		while (1)
		{
			auto it = st.begin(); 
			if (time >= it->ti)
			{
				time -= it->ti;
				b.id = it->id, b.ti = it->ti, b.w = it->w;
				st.erase(it);
				st2.insert(b);
			}
			else break;
			while (st2.begin()->w < st2.size())//删除无效的
			{
				time += st2.begin()->ti;
				st2.erase(st2.begin());
			}
			if (st.empty())break;
		}
		cout << st2.size() << endl << st2.size() << endl;
		for (auto I : st2)cout << I.id << " ";puts("");
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值