BZOJ2824 洛谷P2534 [AHOI2012]铁盘整理
2017-06-10 19:48
309 查看
题目描述:
输入输出格式
输入格式:
共两行。第一行为铁盘个数N(1<=N<=50),第二行为N个不同的正整数,分别为从上到下的铁盘的半径R。(1<=R<=100)
输出格式:
一个正整数,表示使铁盘从小到大有序需要的最少翻转次数。
输入输出样例
输入样例#1:
5
2 4 3 5 1
输出样例#1:
5
//本来这道题想刷一道排序的 //点开就是 搜索+剪枝 #include<cstdio> #include<algorithm> using namespace std; struct Data{ int x,w; bool operator < (Data b) const { return x < b.x; } }a[55]; int n,ans; inline void solve(int step,int tot){ if(tot==0&&a[1].x==1){ ans=min(ans,step); return; } int cnt; for(int i=2;i<=n;i++){ cnt=tot; if(i<n) cnt-=(abs(a[i].x-a[i+1].x)!=1)-(abs(a[1].x-a[i+1].x)!=1); if(step+cnt<ans){ for(int j=1;j<=i/2;j++) swap(a[j],a[i-j+1]); solve(step+1,cnt); for(int j=1;j<=i/2;j++) swap(a[j],a[i-j+1]); } } } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i].x); a[i].w=i; } sort(a+1,a+1+n); for(int i=1;i<=n;i++) a[a[i].w].x=i; ans=n*2; int tot=0; for(int i=2;i<=n;i++) tot += abs(a[i].x-a[i-1].x) != 1; solve(0,tot); printf("%d\n",ans); return 0; }
相关文章推荐
- bzoj 2824: [AHOI2012]铁盘整理
- [BZOJ]2824: [AHOI2012]铁盘整理 dfs
- BZOJ 2824: [AHOI2012]铁盘整理
- [bzoj2824][AHOI2012]铁盘整理
- 洛谷P2534 [AHOI2012]铁盘整理
- 2824: [AHOI2012]铁盘整理
- BZOJ P2824[AHOI2012]铁盘整理
- bzoj2824 铁盘整理【迭代加深搜索】
- IDA*——BZOJ2824/Luogu2534 [AHOI2012]铁盘整理
- [AHOI2012]铁盘整理
- 【BZOJ2823】【AHOI2012】信号塔 最小圆覆盖 计算几何
- 【BZOJ 2823】 [AHOI2012]信号塔
- bzoj2822: [AHOI2012]树屋阶梯
- BZOJ 2823 AHOI2012 信号塔 计算几何
- bzoj2823【AHOI2012】信号塔
- [BZOJ2823][AHOI2012]信号塔
- BZOJ 2822: [AHOI2012]树屋阶梯
- 【AHOI2012】【BZOJ2823】信号塔
- BZOJ2822 [AHOI2012]树屋阶梯
- [BZOJ2822][AHOI2012]树屋阶梯(卡特兰数+组合数学+高精度)