F. Vitaly and Advanced Useless Algorithms

原题链接

题解,没有思路的时候先想想暴力

1.观察观察再观察,对于每个计划而言,所完成的任务是唯一的,所以要完成任务 c相当于在能完成 c 的计划集合里,选择若干个计划,使得其总耗时最小,且完成的超过 100

2.这种包含两种属性限制的集合选择,不难想到背包,即相同耗时,记录完成度高的,但是这样一来,背包的容量就很大,因此我们交换背包的容量和价值,即相同完成度,记录耗时小的,然后该任务的完成时间在完成度 [100,200] 之间选择

3.朴素的贪心,优先完成截止时间靠前的

3.这样一来,时间复杂度大概为 O(n+100m)

code

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const ll INF = 0x3f3f3f3f;
vector<tuple<int, int,int>> plan[200005];
ll dead[200005];
ll ans[200005];

void solve()
{
    int n, m;
    cin >> n >> m;

    for (int i = 1; i <= n; i++)
    {
        cin >> dead[i];
        plan[i].clear();
    }

    for (int i = 1; i <= m; i++)
    {
        int op, ti, com;
        cin >> op >> ti >> com;
        plan[op].push_back({ti, com,i});
    }

    bool flag=1;
    ll sum=0;
    vector<int> jh;
    for (int i = 1; i <= n; i++)
    {
        ll dp[250];
        vector<int> who[250];

        memset(dp, INF, sizeof dp);
        dp[0] = 0;

        for (auto j : plan[i])
        {
            auto [sj,wcd,id]=j;
            for (int k = 200; k >= wcd; k--)
            {
                if(dp[k]>dp[k-wcd]+sj)
                {
                    who[k]=who[k-wcd];
                    who[k].push_back(id);
                    dp[k]=dp[k-wcd]+sj;
                }
            }
        }

        ans[i] = INF;
        int mins=100;
        for (int j = 100; j <=200; j++)
        {
            if(dp[j]<ans[i])
            {
                ans[i]=dp[j];
                mins=j;
            }
        }
        if (sum + ans[i] > dead[i])
        {
            cout<<"-1\n";
            return;
        }
        sum += ans[i];
        for(auto it:who[mins])
        {
            jh.push_back(it);
        }


    }

        cout << jh.size()<<'\n';
        for(auto it:jh) cout<<it<<' ';
        cout<<'\n';
}

int main()
{
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int t = 1;
    cin >> t;
    while (t--) solve();
    return 0;
}

posted @   纯粹的  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示