CF1203F1 完成项目(简单版)

1 CF1203F1 完成项目(简单版)

2 题目描述

时间限制 \(2s\) | 空间限制 \(256M\)

简单版和困难版的唯一区别就是简单版必须完成所有的项目,困难版不需要。

\(Polycarp\) 是一个著名的自由职业者,他当前的 \(rating\)\(r\)。有一些很有钱的客户要求他给公司完成一些项目。为了完成第 \(i\) 个项目,他的 \(rating\) 至少需要到 \(a_i\)。当他完成项目后 \(rating\) 会加上 \(b_i\)\(b_i\) 可以是正数也可以是负数。\(Polycarp\)\(rating\) 不能小于零因为没有人会相信一个 \(rating\) 很低的自由职业者。他有可能完成这些项目吗?写一个程序判断是不是存在一个项目的序列使得他这开始每个项目之前都有足够的 \(rating\),而且每个项目结束后他的 \(rating\) 不小于零。

数据范围:\(1≤𝑛≤100,1≤𝑟≤30000)\),\(1≤𝑎_𝑖≤30000, −300≤𝑏_𝑖≤300\)

3 题解

我们发现:如果某一个项目所给的 \(rating\) 为负,一个项目所给的 \(rating\) 为正,那么我们肯定优先考虑给的 \(rating\) 多的项目。这是因为如果我们当前的 \(rating\) 只比所给 \(rating\) 为负的项目要求的要大,那么我们做完这个项目也只会减少 \(rating\),不可能完成其他项目。而如果两个项目所给的 \(rating\) 都为正,我们显然要先做所需 \(rating\) 少的那个项目。这是因为如果我们的 \(rating\) 比两个项目要求的都多,那么这两个项目必定都可以完成,顺序就没有关系了。如果我们的 \(rating\) 少一些,那么我们就只能做所需 \(rating\) 项目了,因此做所需 \(rating\) 少的项目是最优的。

如果两个项目所给的 \(rating\) 都是负的,那么此时我们按照所需 \(rating\) 加上所给 \(rating\) 从大到小排序。这两个值之和就可以看作,完成这个项目后最少得到的 \(rating\)。我们肯定希望我们得到的 \(rating\) 先大后小,这样才有可能完成所有项目。而且,由于所给 \(rating\) 为负,不可能出现初始 \(rating\) 比所需 \(rating\) 加上所给 \(rating\) 最大的项目的所需 \(rating\) 小且存在可以完成所有项目的方案的情况。因为这些项目中之要有一个项目的所需 \(rating\) 大于初始 \(rating\),那么我们就无法完成所有项目:\(rating\) 只增不减。而从大到小排序就使每一步后拥有的 \(rating\) 尽可能多,从而使完成所有项目的可能性最大。

\(n\) 只有 \(100\),所以直接用冒泡排序即可。

4 代码(空格警告):

#include <iostream>
#include <algorithm>
#include <queue>
#include <stdlib.h>
#include <cstdlib>
using namespace std;
const int N = 105;
const int M = 3e4+10;
int n, r, last, now, t;
priority_queue< pair<int, int> > q;
struct pro
{
    int a, b;
}c[N];
bool check()
{
    now = r;
    for (int i = 1; i <= n; i++)
    {
        if (c[i].a <= now) now += c[i].b;
        else
        {
            return 0;
        }
    }
    if (now < 0) return 0;
    return 1;
}
int main()
{
    cin >> n >> r;
    for (int i = 1; i <= n; i++) cin >> c[i].a >> c[i].b;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j < n; j++)
        {
            if (c[j].b < 0 && c[j+1].b >= 0) swap(c[j], c[j+1]);
            else if (c[j].b < 0 && c[j+1].b < 0 && c[j].a + c[j].b < c[j+1].a + c[j+1].b) swap(c[j], c[j+1]);
            else if (c[j].b >= 0 && c[j+1].b >= 0 && c[j].a > c[j+1].a) swap(c[j], c[j+1]);
        }
    }
    if (check())
    {
        cout << "YES";
        return 0;
    }
    cout << "NO";
    return 0;
}

欢迎关注我的公众号:智子笔记

posted @ 2021-03-10 21:17  David24  阅读(87)  评论(0编辑  收藏  举报