zoukankan      html  css  js  c++  java
  • ARC097E Sorted and Sorted

    传送门

    题目

    There are 2N balls, N white and N black, arranged in a row. The integers from 1 through N are written on the white balls, one on each ball, and they are also written on the black balls, one on each ball. The integer written on the i-th ball from the left (1 i 2N) is ai, and the color of this ball is represented by a letter ci. ci = W represents the ball is white; ci = B represents the ball is black.

    Takahashi the human wants to achieve the following objective:

    • For every pair of integers (i,j) such that 1 i < j N, the white ball with i written on it is to the left of the white ball with j written on it.
    • For every pair of integers (i,j) such that 1 i < j N, the black ball with i written on it is to the left of the black ball with j written on it.

    In order to achieve this, he can perform the following operation:

    • Swap two adjacent balls.

    Find the minimum number of operations required to achieve the objective.

    Constraints

    • 1 N 2000
    • 1 ai N
    • ci = W or ci = B.
    • If i j, (ai,ci) (aj,cj)

    Input

    Input is given from Standard Input in the following format:

    N
    c1 a1
    c2 a2
    :
    c2N a2N
    

    Output

    Print the minimum number of operations required to achieve the objective.

    题目大意

    给出一个黑棋N个白棋N个的排列,每一种颜色的球分别标上1 - N,每次可以交换相邻两个球,求白棋相对顺序正确并且黑棋相对顺序正确,所需要最少的步数

    分析

    设dpij为排好白球前i个和黑球前j个所需最小步数,用a和b数组分别记录黑白球的每一数值所在位置,用c1和c2分别记录将黑白球某一数值x移到此颜色的x-1数值之后所需步数(这里的步数既有同色数目又有异色数目)。所以我们不难想出dpij由dpi-1j和dpij-1转移而来,因此得到方程式dp[i][j]=min(dp[i-1][j]+c1[i][j],dp[i][j-1]+c2[i][j])。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<ctime>
    #include<queue>
    #include<vector>
    #include<set>
    #include<map>
    #include<stack>
    using namespace std;
    int dp[2100][2100],a[2100],b[2100],c1[2100][2100],c2[2100][2100];
    int main(){
          int n,m,i,j,k,x;
          char ch;
          cin>>n;
          for(i=1;i<=2*n;i++){
               cin>>ch>>x;
               if(ch=='B'){
                   a[x]=i;
               }else {
                   b[x]=i;
               }
          }
          for(i=1;i<=n;i++){
               for(j=1;j<i;j++)
                  if(a[i]<a[j])c1[i][0]++;
               for(j=1;j<=n;j++){
                   c1[i][j]=c1[i][j-1];
                   if(b[j]>a[i])c1[i][j]++;
               }
          }
          //c用于记录要向后走几步
          for(i=1;i<=n;i++){
               for(j=1;j<i;j++)
                  if(b[i]<b[j])c2[0][i]++;
               for(j=1;j<=n;j++){
                   c2[j][i]=c2[j-1][i];
                   if(a[j]>b[i])c2[j][i]++;
               }
          }
          int wh1=0,wh2=0;
          for(i=1;i<=n;i++){
               wh1+=c1[i][0];
               wh2+=c2[0][i];
               dp[i][0]=wh1;
               dp[0][i]=wh2;
          }
          for(i=1;i<=n;i++)
             for(j=1;j<=n;j++)
                dp[i][j]=min(dp[i-1][j]+c1[i][j],dp[i][j-1]+c2[i][j]);
          cout<<dp[n][n]<<endl;
          return 0;
    }

  • 相关阅读:
    (资源搜索类)几个好用的磁力搜索网站
    百度网盘不限速,直接获取直链
    百度网盘偷偷更新,免费也终于不限速了
    ES6新特性之箭头函数与function的区别
    [亲测可用]BCompare文件比较对比工具4.3.4绿色版
    Autofac 动态获取对象静态类获取对象
    Linq to SQL 语法整理(子查询 & in操作 & join )
    小程序监听页面滚动开始和滚动结束
    C# Task.Run 和 Task.Factory.StartNew 区别
    Entity Framework Core必须牢记的三条引用三条命令
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/9115004.html
Copyright © 2011-2022 走看看