2 条题解

  • 2
    @ 2026-7-25 0:33:25

    第一次写题解不是特别会,求指点

    整体思路

    这是一道贪心题,过程: 1.贪什么:最后一次奖励下发的时间最小

    2.怎么贪:将每个任务的b进行排序,越大的越前(在等待奖励下发时,可以继续完成其他任务),实现时间的完美利用(我是这么理解的)

    3. 为何贪(证明): 假设两个相邻的任务等待的时长为bx和by,若bx>by,那么将x放在y前面则为优,所以可得所有任务按b进行降序排列为最优解。

    具体代码怎么做呢

    可以用到pair捆绑结构体自定义结构体 我分享一个结构体解法:(pair我不熟悉) 1.定义一个结构体,包含a,b

    2.写一个判断函数,以便sort排序用(大致的内容上面有提到)

    3.排序后遍历,将时间总和算出,以及奖励派送时间(结果)

    AC代码

    #include <bits/stdc++.h>
    using namespace std;
    struct Node{
        long long a,b;
    };//第i个任务的时间(a)以及完成后所需等待的时间(b) 
    bool cmp(Node x,Node y){
    	return x.b > y.b;
    } //按照b从大到小排序 
    Node s[200005];
    long long n,sum,ans;//防止数据很大,开long long 
    int main() {
    	ios::sync_with_stdio(false);
        cin.tie(0);
        //加速,也能用scanf、printf 
        cin >> n;
        for(int i=1;i<=n;i++){
            cin >> s[i].a >> s[i].b;
        }//输入 (从1开始遍历) 
        sort(s+1,s+n+1,cmp); //将数组排序
        for(int i=1;i<=n;i++){
        	sum += s[i].a; //将n个任务花的时间加起来 
        	ans = max(ans,s[i].b+sum); //用等待时间加上完成时间算出奖励派送的时间,再对比并迭代一下 
    	}
    	cout << ans;//输出 
        return 0;
    }
    

    代码仅供参考,不一定最优

    • @ 2026-7-25 9:45:02

      要不我改天出个pair?

  • 0
    @ 2026-7-25 12:26:57

    前面没有AC是不是没有用long long

    • @ 2026-7-25 15:56:21

      或许是,我之前也被数据整得没有过

    • @ 2026-7-25 17:02:34

      如果你连测试的都没过就当我没说上句话,你的思路可能没对

  • 1

信息

ID
238
时间
2000ms
内存
256MiB
难度
4
标签
递交数
9
已通过
3
上传者