题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5122
题目分类:思维题
题意:n个数字,将它变成一个升序序列需要变换几次,
几个例子深入理解
5
2 3 4 5 1
(4)
3 4 1 5 2
(3)
题目分析:最先想的是直接两重循环来做,超时 后来想可能是最长上升子序列,发现不合题意
最后想找1 1前面的都是需要往后移的,然后找2 一直往后
代码:
#include<bits/stdc++.h> using namespace std; #define INF 0x3f3f3f3f const int N=1000009; int a[1000009]; int b[1000009]; int main() { int t,n; cin>>t; for(int kase=1;kase<=t;kase++) { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); b[a[i]]=i; } int maxi=0; int ans=0; for(int i=1;i<=n;i++) { if(b[i]<maxi) continue; ans+=(b[i]-maxi-1); maxi=max(maxi,b[i]); //printf("%d %d ",i,ans); } printf("Case #%d: ",kase); printf("%d ",ans); } return 0; }