博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ2882工艺
阅读量:7170 次
发布时间:2019-06-29

本文共 1137 字,大约阅读时间需要 3 分钟。

题目描述

小敏和小燕是一对好朋友。
他们正在玩一种神奇的游戏,叫Minecraft。
他们现在要做一个由方块构成的长条工艺品。但是方块现在是乱的,而且由于机器的要求,他们只能做到把这个工艺品最左边的方块放到最右边。
他们想,在仅这一个操作下,最漂亮的工艺品能多漂亮。
两个工艺品美观的比较方法是,从头开始比较,如果第i个位置上方块不一样那么谁的瑕疵度小,那么谁就更漂亮,如果一样那么继续比较第i+1个方块。如果全都一样,那么这两个工艺品就一样漂亮。
题解
最小表示法
做法:维护两个指针i&j,初始时令i=1,j=2。每次比较当前位置是否相同,如果相同就继续比较下一位,如果出现的不一样的地方。
那么假设a[i+k]>a[j+k],那么i~i+k都不可能成为最佳开头,那么直接跳过这一部分就好。
注意当操作到i=j时要让j++,保证我们的比较是合法的。
代码
#include
#include
#define N 630009using namespace std;typedef long long ll;int n,a[N];inline ll rd(){ ll x=0;char c=getchar();bool f=0; while(!isdigit(c)){
if(c=='-')f=1;c=getchar();} while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();} return f?-x:x;}int main(){ n=rd(); for(int i=1;i<=n;++i)a[i]=rd(); for(int i=1;i<=n;++i)a[i+n]=a[i]; int i=1,j=2,k=0; while(i<=n&&j<=n&&k<=n){ ll delta=a[i+k]-a[j+k]; if(!delta)k++; else{ if(delta>0)i=i+k+1; else j=j+k+1;k=0; if(i==j)j++; } } int now=min(i,j); for(int i=now;i<=now+n-1;++i)printf("%d ",a[i]); return 0;}

转载于:https://www.cnblogs.com/ZH-comld/p/10473281.html

你可能感兴趣的文章
ubuntu12.04装有线网卡驱动(AR8162)
查看>>
迭代器
查看>>
多线程有几种实现方法?同步有几种实现方法
查看>>
element-ui 分页中的slot的用法(自定义分页显示内容)
查看>>
程序员的Lua快速入门
查看>>
Django 代码初体验
查看>>
大数据及智能信息系统
查看>>
[杂记]拜占庭将军问题
查看>>
关于数据请求中的多级联动的问题
查看>>
用jQuery和ajax实现搜索框文字自动补全功能
查看>>
hausaufgabe--python 27 - set
查看>>
分享职场心得《5》
查看>>
利用Response.Buffer做类似异步效果
查看>>
Nyoj 修路方案(次小生成树)
查看>>
git 使用
查看>>
毕业论文管理系统9
查看>>
动态规划初步习题(紫书)
查看>>
类的copy和deepcopy
查看>>
JRE“瘦身”&桌面程序集成JRE
查看>>
h5移动端性能优化
查看>>