程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> CodeForces Round #119 (187A) - Permutations

CodeForces Round #119 (187A) - Permutations

編輯:C++入門知識

  這題突破點或者說關鍵之處就在第二列最後一個數在第一列中的位置...
      設第二列最後一個數為x...設x在第一列位置為i..1~i的順序是符合第二列中數字前後關系的話..那易得所需的最小移動步數就是不斷抽第一列最後的數使得x到第n位..
      若是1~i不是按第二列的數字關系遞增的話..也很好想到將x移到第k+1位..其中1~k是最長的按第二列的數字關系遞增的..再不斷的抽第一列最後的數使得x到第n位..

Program:
[cpp]
#include<iostream> 
#include<algorithm> 
#include<stdio.h> 
#include<string.h> 
#include<cmath> 
#include<queue> 
#define oo 2000000000 
#define ll long long 
using namespace std; 
int sa[200005],sb[200005],a[200005],b[200005]; 
int main() 
{        
       int i,n,ans; 
       scanf("%d",&n); 
       for (i=1;i<=n;i++) 
       { 
             scanf("%d",&a[i]); 
             sa[a[i]]=i; 
       } 
       for (i=1;i<=n;i++)  
       { 
             scanf("%d",&b[i]); 
             sb[b[i]]=i; 
       } 
       for (i=2;i<=n;i++) 
          if (sb[a[i-1]]>sb[a[i]]) break; 
       i--; 
       if (i!=sa[b[n]]) ans=n-i; 
          else  ans=n-sa[b[n]]; 
       printf("%d\n",ans);  
       return 0; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved