• P8197 [传智杯 #4 决赛] 排排队


    cyq 在 tsyz 担任了体育老师,负责排队一事。

    在 tsyz 中,每个人都有一个身高 ai​,并且只有相邻的两个人可以交换位置。cyq 带领的队伍有 n 个人,他现在要给大家排队形。

    给定一个长度为 n 的序列 b,一个队形被认为美观,当且仅当对于所有的 i=1,2,3,…n,ai​=bi​。cyq 想知道,他能否让大家的队形变得美观,并且交换相邻两个人的次数不超过 n^2 次。这个问题把 cyqcyq 难住了,请你帮他来解决这个问题,如果存在合法的交换方案,输出 YES,并给出一组方案;否则,输出 NO

    输入格式

    本题单测试点内有多组测试数据

    第一行是一个整数 T,表示数据组数,对于每组数据:
    第一行是一个整数,表示队伍的长度 n。
    第二行有 n 个整数,第 i 个整数表示第 i 个人的身高 ai​。
    第三行有 n 个整数,第 i 个整数表示美观队形里第 i 个人的身高 bi​。

    输出格式

    对每组数据依次分别输出答案。

    对于每组数据,若存在一种方案,则在第一行输出一个 YES,否则输出一个 NO

    如果输出 YES,下面则输出若干行每行两个整数 i,j,表示第 i个同学和第 j个同学交换位置,显然 ∣i−j∣=1。在交换完成后,你还需要输出一行  0 表示你的操作结束了,请注意数组的下标从 1 开始编号至 n。

    如果输出 NO,则接下来什么都不需要输出。

    请特别注意,对于每组数据,你的操作次数不能超过 n^2(不包括 0 0 一行),否则将得到 WA(Wrong Answer) 的结果

    输入输出样例

    输入 #1复制

    3
    4
    1 2 2 3
    3 2 2 1
    3
    1 2 3
    1 2 4
    1
    1
    1
    

    输出 #1复制

    YES
    4 3
    2 3
    1 2
    3 2
    3 4
    0 0
    NO
    YES
    0 0
    

    说明/提示

    数据规模与约定

    对于全部的测试点,保证 1≤T≤10,1≤n≤103,1≤ai​,bi​≤109,且各个测试点 n 之和不超过 1000,即 ∑n≤103。

    提示

    • 请注意大量的输出输出对程序效率造成的影响,不要频繁刷新缓冲区。例如,对于使用 std::cout 的 C++ 选手,请使用 '\n' 而不是 std::endl 来换行;对于 java 选手,请选择高效率的输出方式,如使用 PrintWriter;python 选手可以正常的使用 print 而无需考虑效率问题。
    • 请按照输出格式的要求输出您的答案,如果格式不符合要求,返回的评测信息将可能是 TLE、RE、WA、UKE 等任何结果。

    C++ 语言的高效输出样例

    1. #include <iostream>
    2. int main() {
    3. std::ios::sync_with_stdio(false);
    4. std::cin.tie(0);
    5. for (int i = 1; i <= 5; ++i) {
    6. std::cout << i << '\n'; // 注意这里不能使用 std::endl
    7. }
    8. }

    Java 语言的高效输出样例

    1. import java.io.PrintWriter;
    2. public class Main {
    3. public static void main(String[] args) {
    4. PrintWriter ot = new PrintWriter(System.out);
    5. for (int i = 1; i <= 5; ++i) {
    6. ot.println(i);
    7. }
    8. ot.flush(); // 请务必保证在程序结束时运行本条语句,否则在缓冲区的内容无法输出
    9. }
    10. }
    1. #include <iostream>
    2. #include <algorithm>
    3. using namespace std;
    4. int main(){
    5. int t;
    6. scanf("%d",&t);
    7. while(t--){
    8. int n,a[1005],a1[1005],b[1005],b1[1005],temp=0;
    9. scanf("%d",&n);
    10. for(int i=1;i<=n;i++){
    11. scanf("%d",&a[i]);
    12. a1[i]=a[i];
    13. }
    14. for(int i=1;i<=n;i++){
    15. scanf("%d",&b[i]);
    16. b1[i]=b[i];
    17. }
    18. sort(a1+1,a1+n+1);
    19. sort(b1+1,b1+n+1);
    20. for(int i=1;i<=n;i++){
    21. if(a1[i]!=b1[i])
    22. temp=1;
    23. }
    24. if(temp){
    25. printf("NO\n");
    26. }
    27. else{
    28. printf("YES\n");
    29. for(int i=1;i<=n;i++)//循环b的元素
    30. {
    31. int x;
    32. for(int j=1;j<=n;j++)
    33. {
    34. if(a[j]==b[i])
    35. {
    36. x=j;
    37. break;
    38. }
    39. }
    40. for(int j=x;j>i;j--)
    41. {
    42. swap(a[j],a[j-1]);
    43. printf("%d %d\n",j,j-1);
    44. }
    45. }
    46. printf("0 0\n");
    47. }
    48. }
    49. }

     

  • 相关阅读:
    自动化测试的十大优势
    Linux文件管理知识查找文件
    全套完整版实战型Java云HIS系统源码
    CSS详细基础(六)边框样式
    代码随想录Day_57打卡
    C++函数重载中形参是引用类型和常量引用类型的调用方法
    spring的简单使用(配合Druid操作数据库)
    直播带货代运营公司9人被抓
    C#实现十大经典排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、堆排序、计数排序、桶排序、基数排序
    SpringCloud Stream笔记整理
  • 原文地址:https://blog.csdn.net/q619718/article/details/128026658