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 }


     

  • 相关阅读:
    Python爬虫3大解析库使用导航
    pyquery解析库的介绍和使用
    BeautifulSoup解析库的介绍和使用
    Xpath解析库的使用
    python爬虫之正则表达式(用在其他地方也可)
    requests的基本使用
    Linux下防范小型cc攻击
    图片素材资源
    postman安装
    edraw快捷键
  • 原文地址:https://www.cnblogs.com/qqky/p/7039968.html
Copyright © 2011-2022 走看看