1. 程式人生 > >洛谷 P2534 [AHOI2012]鐵盤整理

洛谷 P2534 [AHOI2012]鐵盤整理

targe ans -m 一行 content scanf 有序 pid flag

P2534 [AHOI2012]鐵盤整理

題目描述

技術分享

技術分享

輸入輸出格式

輸入格式:

共兩行。第一行為鐵盤個數N(1<=N<=50),第二行為N個不同的正整數,分別為從上到下的鐵盤的半徑R。(1<=R<=100)

輸出格式:

一個正整數,表示使鐵盤從小到大有序需要的最少翻轉次數。

輸入輸出樣例

輸入樣例#1:
5
2 4 3 5 1
輸出樣例#1:
5
思路:(手動滑稽!!本題輸出n可得30分,(*^__^*) )IDA*的經典。
#include<iostream>
#include
<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,ans,flag,a[55]; struct nond { int r,id; }v[55]; int cmp(nond x,nond y){ return x.r<y.r; } int H(){ int bns=0; for(int i=1;i<n;i++) if(abs(a[i]-a[i+1])!=1) bns++;
return bns; } void dfs(int k,int g){ int h=H(); if(!h&&a[1]<a[2]){ ans=k; return; } if(h+g>k||ans||g==k) return ; for(int i=2;i<=n;i++) if(abs(a[i]-a[i+1])!=1){ for(int j=1;j<=i/2;j++) swap(a[j],a[i-j+1]); dfs(k,g
+1); 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",&v[i].r); v[i].id=i; } sort(v+1,v+1+n,cmp); for(int i=1;i<=n;i++) a[v[i].id]=i; a[0]=-0x7f7f7f7f;a[n+1]=0x7f7f7f7f; for(int k=0;;k++){ dfs(k,0); if(ans){ cout<<ans; break; } } }

 

洛谷 P2534 [AHOI2012]鐵盤整理