2025/1/24课堂记录
目录
- 旅行问题
首先看见问题,我就差不多能猜到应该是dp
然后他是一个环,任何点都可能是起点,终点
而且只会转一圈,那就没必要用每次i++再%的方式了
直接把数组复制一倍
比如说123这个环
1当起点:123123
2当起点:123123
3当起点:123123
逆时针也一样
剩下的就简单了
走一步看一步,没油了就算不行
50分朴素dp,剩下超时
#include<iostream>
using namespace std;
long long int n,p[3000000],d[3000000];
bool shun(int i)
{
int station=i+n;
long long int oil=0;
for(;i<=station;i++)
{
oil=oil+p[i]-d[i];
if(oil<0) return 0;
}
return 1;
}
bool ni(int i)
{
int station=i-n;
long long int oil=0;
for(;i>=station;i--)
{
oil=oil+p[i]-d[i-1];
if(oil<0) return 0;
}
return 1;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>p[i]>>d[i];
p[n+i]=p[i];
d[n+i]=d[i];
}
// for(int i=1;i<=2*n;i++)cout<<p[i]<<" "<<d[i]<<"\n";
for(int i=1;i<=n;i++)
{
if(shun(i)==0&&ni(i+n)==0)cout<<"NIE\n";
else cout<<"TAK\n";
}
return 0;
}
然后还看了一个比较新的代码
先把代码放出来
#include<bits/stdc++.h>
#define int long long
using namespace std;
#define R 1000001
int n,m,o[R],d[R],s[2*R],ans[R];
pair<int,int>p;
deque< pair<int,int> >q;
signed main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>o[i]>>d[i];
for(int i=1;i<=2*n;i++) s[i]=s[i-1]+o[(i-1)%n+1]-d[(i-1)%n+1];
for(int i=1;i<=n;i++)
{
while(!q.empty()&&q.back().first>s[i]) q.pop_back();
p.first=s[i],p.second=i;
q.push_back(p);
}
for(int i=n+1;i<=2*n;i++)
{
ans[i-n]=q.front().first-s[i-n-1];
while(!q.empty()&&i-q.front().second+1>n) q.pop_front();
while(!q.empty()&&q.back().first>s[i]) q.pop_back();
p.first=s[i],p.second=i;
q.push_back(p);
}
q.clear();
for(int i=1,j=2*n;i<=2*n;i++,j--) s[i]=s[i-1]+o[(j-1)%n+1]-d[((j-1>0?j-1:n)-1)%n+1];
for(int i=1;i<=n;i++)
{
while(!q.empty()&&q.back().first>s[i]) q.pop_back();
p.first=s[i],p.second=i;
q.push_back(p);
}
for(int i=n+1;i<=2*n;i++)
{
ans[2*n-i+1]=max(ans[2*n-i+1],q.front().first-s[i-n-1]);
while(!q.empty()&&i-q.front().second+1>n) q.pop_front();
while(!q.empty()&&q.back().first>s[i]) q.pop_back();
p.first=s[i],p.second=i;
q.push_back(p);
}
for(int i=1;i<=n;i++) printf(ans[i]>=0?"TAK\n":"NIE\n");
return 0;
}
首先,这个代码满分
用的是单调队里优化,而且是真的单调队列,不是数组模拟的
queue是队列,deque就是双端队列
pair其实就相当于结构体,而且是只能存两个数据的结构体,随用随定义
其中p就是一个pair,它是专门用来入队用的
q这个队列里面存的都是pair类型的数据
剩下的它也是直接套用的单调队列模板
先计算f[],再控制区间长度,再维护单调性
看着很难其实一点都不简单
现在是2025/2/7,看着三个周前的存稿,直接摆烂,其实后来还讲了一点树形dp,但是不难,没有新东西,就没再写了,只有一道新题战略游戏
本文来自博客园,作者:永韶,转载请注明原文链接:https://www.cnblogs.com/yongshao/p/18690386
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek-R1本地部署如何选择适合你的版本?看这里
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
· 我们是如何解决abp身上的几个痛点
· 普通人也能轻松掌握的20个DeepSeek高频提示词(2025版)