P1963 [NOI2009] 变换序列
P1963 [NOI2009] 变换序列
求最小字典序
匈牙利算法进行匹配
因为每一次是要求已经匹配好的人进行换对象
如果从前面开始,那就是会要求前面已经匹配好的人换对象,答案就不一定是字符串最小
而如果从后面开始,那就是要求后面已经匹配好的人换对象,一定可以保证局部字典序最小
//选择字典序最小的就可以了 //最多和两个点进行匹配 #include <bits/stdc++.h> using namespace std; const int N=10005; const int M=2*N; inline int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} return x*f; } int g[N][2]; int vis[N],match[N]; int ans[N]; bool dfs(int now,int dep) { for(int i=0;i<2;i++) { int to=g[now][i]; if(vis[to]==dep)continue; vis[to]=dep; if(match[to]==-1||dfs(match[to],dep)) { match[to]=now; ans[now]=to; return 1; } } return 0; } int main() { memset(match,-1,sizeof(match)); memset(vis,-1,sizeof(vis)); int n=read(); for(int i=0;i<n;i++) { int x=read(); int t1=(i+x)%n,t2=(i-x+n)%n; if(t1>t2)swap(t1,t2); g[i][0]=t1; g[i][1]=t2; } for(int i=n-1;i>=0;i--) if(dfs(i,i)==0)return cout<<"No Answer",0; for(int i=0;i<n;i++)cout<<ans[i]<<' '; return 0; } //逆向思维进行贪心就可以了 //从后面开始就是对的 //有的时候求字典序最小或者说其他东西最小,往往只需要把某些东西调换一下子就可以了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!