2025/1/24课堂记录

目录

  1. 旅行问题

首先看见问题,我就差不多能猜到应该是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,但是不难,没有新东西,就没再写了,只有一道新题战略游戏

posted @   永韶  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek-R1本地部署如何选择适合你的版本?看这里
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
· 我们是如何解决abp身上的几个痛点
· 普通人也能轻松掌握的20个DeepSeek高频提示词(2025版)
点击右上角即可分享
微信分享提示