F. Vitaly and Advanced Useless Algorithms
题解,没有思路的时候先想想暴力
1.观察观察再观察,对于每个计划而言,所完成的任务是唯一的,所以要完成任务
2.这种包含两种属性限制的集合选择,不难想到背包,即相同耗时,记录完成度高的,但是这样一来,背包的容量就很大,因此我们交换背包的容量和价值,即相同完成度,记录耗时小的,然后该任务的完成时间在完成度
3.朴素的贪心,优先完成截止时间靠前的
3.这样一来,时间复杂度大概为
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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~