已解决
【学习笔记】CF704B Ant Man
来自网友在路上 178878提问 提问时间:2023-10-06 22:48:30阅读次数: 78
最佳答案 问答题库788位专家为你答疑解惑
智商不够啊,咋想到贪心的😅
非常经典的贪心模型🤔
首先,从小到大将每个 i i i插入到排列中,用 D P DP DP记录还有多少个位置可以插入,可以通过钦定新插入的位置左右两边是否继续插入数来提前计算贡献。注意分 i i i和 s , t s,t s,t的大小关系讨论。这个做法的时间复杂度是 O ( n 2 ) O(n^2) O(n2),并且转移的情况比较多,估计要调半天。
但是注意到,我们可以 直接贪心 。发现本质上就是每次加入两个固定的数,然后将原来的一个数替换掉,并且一个数只能被替换一次。因此每次贪心的选最优的位置插入即可。
代码可以在 5 min 5\min 5min内完成。
另一道直接贪心的题:CF573E Bear and Bowling
#include<bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pb push_back
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
const int N=5005;
int n,s,t,to[N];
ll a[N],b[N],c[N],d[N],X[N],res;
ll calc(int i,int j){if(i>j)return X[i]-X[j]+c[i]+b[j];return X[j]-X[i]+d[i]+a[j];
}
int main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n>>s>>t;for(int i=1;i<=n;i++)cin>>X[i];for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<=n;i++)cin>>b[i];for(int i=1;i<=n;i++)cin>>c[i];for(int i=1;i<=n;i++)cin>>d[i];to[s]=t;for(int i=1;i<=n;i++){if(i==s||i==t)continue;pair<ll,int>tmp={inf,0};for(int j=s;j!=t;j=to[j]){tmp=min(tmp,{calc(j,i)+calc(i,to[j])-calc(j,to[j]),j});}to[i]=to[tmp.se],to[tmp.se]=i;}for(int i=s;i!=t;i=to[i])res+=calc(i,to[i]);cout<<res;
}
查看全文
99%的人还看了
相似问题
- 分发糖果(贪心算法)
- 力扣贪心——跳跃游戏I和II
- SDUT OJ《算法分析与设计》贪心算法
- 【每日一题】—— C. Yarik and Array(Codeforces Round 909 (Div. 3))(贪心)
- 【华为OD机试AB高分必刷题目】拆分(Python-贪心算法实现)
- LeetCode-765. 情侣牵手-贪心
- 【LeetCode】每日一题 2023_11_11 情侣牵手(并查集/贪心)
- LC-2300. 咒语和药水的成功对数(排序+贪心、排序+二分)
- 洛谷 P1020 [NOIP1999 普及组] 导弹拦截【一题掌握三种方法:动态规划+贪心+二分】最长上升子序列LIS解法详解
- 区间调度问题及贪心算法证明
猜你感兴趣
版权申明
本文"【学习笔记】CF704B Ant Man":http://eshow365.cn/6-16503-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!