zoukankan      html  css  js  c++  java
  • 4、 序列交换--全国模拟(四)

    [编程题] 序列交换
    时间限制:1秒
    空间限制:32768K
    牛牛有一个长度为n的整数序列s,羊羊要在牛牛的序列中选择不同的两个位置,然后交换这两个位置上的元素。现在需要求出羊羊交换后可以得到的不同的序列个数。(注意被交换的两元素值可能相同)。
    如序列{1, 47},输出1.羊羊必须交换仅有的两个元素,得到序列{47, 1}。羊羊必须交换,不能保留原有的序列。
    {1, 2, 1},输出3.羊羊通过交换可以得到{2, 1, 1},{1, 1, 2},{1, 2, 1}这三个序列。 
    输入描述:
    输入包括两行,第一行为一个整数n(2 ≤ n ≤ 50),即序列的长度。 第二行n个整数,表示序列的每个元素a_i(1 ≤ a_i ≤ 50),以空格分割。
     
     
    输出描述:
    输出一个整数,表示羊羊可以得到的不同的序列个数
     
    输入例子:
    3 1 2 1
     
    输出例子:
    3
     
    解题思路:我自己的思路是,用int数组存储,然后交换数组的i和j位,然后转成字符串,存入set中
     1 #include <iostream>
     2 #include <set>
     3 #include<sstream>
     4 #include <memory.h>
     5 using namespace std;
     6 void Fun(int *str,int n,int start,int end,int *temp)
     7 {
     8     for(int i=0;i<n;i++)
     9     {
    10         temp[i] = str[i];
    11     }
    12     int r = temp[start];
    13     temp[start] = temp[end];
    14     temp[end] = r;
    15     /*for(int i=0;i<n;i++)
    16     {
    17         cout<<"temp "<<temp[i]<<" ";
    18     }
    19     cout<<endl;*/
    20 }
    21 //int 数组转string
    22 string IntToString(int & i)
    23 {
    24   string s;
    25   stringstream ss(s);
    26   ss<<i;
    27   return ss.str();
    28 }
    29 int main()
    30 {
    31     int n;
    32     while(cin>>n)
    33     {
    34         int a[n];
    35         int t[n];
    36         set<string> s;
    37         string strs;
    38         for(int i=0;i<n;i++)
    39         {
    40             cin>>a[i];
    41         }
    42  
    43         for(int i=0;i<n;i++)
    44         {
    45             for(int j=i+1;j<n;j++)
    46             {
    47                 Fun(a,n,i,j,t);
    48  
    49                 for(int k=0;k<n;k++)
    50                 {
    51  
    52                     int &tt=t[k];
    53                     strs+=IntToString(tt);
    54                 }
    55                 s.insert(strs);
    56                 strs.clear();
    57             }
    58         }
    59         cout<<s.size()<<endl;
    60         s.clear();
    61  
    62     }
    63     return 0;
    64 }


    有一个测试用例未通过,不知道原因。

    参考网上思路:是用vector存储,然后set<vector<int>>,也是交换i和j位,然后放入set
     1 #include <iostream>
     2 #include <set>
     3 #include <vector>
     4  
     5 using namespace std;
     6  
     7  
     8 int main()
     9 {
    10     int n;
    11     while(cin>>n)
    12     {
    13         vector<int> a;
    14         int temp;
    15         set<vector<int> > s;
    16  
    17         for(int i=0;i<n;i++)
    18         {
    19             cin>>temp;
    20             a.push_back(temp);
    21         }
    22  
    23         for(int i=0;i<n;i++)
    24         {
    25             for(int j=i+1;j<n;j++)
    26             {
    27                 swap(a[i],a[j]);
    28                 s.insert(a);
    29                 swap(a[i],a[j]);
    30             }
    31         }
    32         cout<<s.size()<<endl;
    33         s.clear();
    34  
    35     }
    36     return 0;
    37 }


     

  • 相关阅读:
    LeetCode Path Sum II
    LeetCode Longest Palindromic Substring
    LeetCode Populating Next Right Pointers in Each Node II
    LeetCode Best Time to Buy and Sell Stock III
    LeetCode Binary Tree Maximum Path Sum
    LeetCode Find Peak Element
    LeetCode Maximum Product Subarray
    LeetCode Intersection of Two Linked Lists
    一天一个设计模式(1)——工厂模式
    PHP迭代器 Iterator
  • 原文地址:https://www.cnblogs.com/qqky/p/7039968.html
Copyright © 2011-2022 走看看