实验6vector和set

1

锯齿矩阵是指每一行包含的元素个数不相同的矩阵,比如: 3 5 2 6 12 3 41 6 2 7 读入若干对整数(x,y) ,表示在第x行的末尾加上一个元素y。输出最终的锯齿数组。初始时矩阵为空。Input多组输入(不超过100组)第一行输入两个整数n,m(1≤n,m≤10000),其中n表示锯齿数组的行数,m表示插入的元素总数。接下来一共m行,每行两个整数x,y(1≤x≤n,0≤y≤10000) ,表示在第x行的末尾插入一个元素y。Output对于每组数据,输出n行。每行若干个用空格分隔的整数(末尾没有空格)。如果某行没有任何元素,则输出一个空行。

Sample Input

3 12

1 3

2 2

2 3

2 4

3 1

3 6

1 5

1 2

1 6

3 2

3 7

1 1

Sample Output

3 5 2 6 1

2 3 4

1 6 2 7

当成数组操作即可

#include <bits/stdc++.h>

using namespace std;



int main(){

  int n = 0, m = 0; cin >> n >> m;

  vector<vector<int> > matrix(n);

  for(int i = 0; i < m; ++i) {

    int a = 0, b = 0; cin >> a >> b;

    matrix[a - 1].push_back(b);

  }

  for(int i = 0; i < n; ++i) {

    for(int j = 0; j < matrix[i].size(); ++j) {

      cout << matrix[i][j];

      if(j < matrix[i].size() - 1)  cout << " ";

    }

    cout << endl;

  }

  return 0;

}


2

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N <= 100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。Input输入数据有多组每组有2行,第1行为1个正整数,表示所生成的随机数的个数:N第2行有N个用空格隔开的正整数,为所产生的随机数。Output每组输出也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。

Sample Input

10

20 40 32 67 40 20 89 300 400 15

Sample Output

8

15 20 32 40 67 89 300 400

set里的数据不重复且默认按升序排列,只需要将数据存入set再输出即可

#include <bits/stdc++.h>

using namespace std;



int main(){

  int n = 0; cin >> n;

  set<int> myset;

  for(int i = 0; i < n; ++i) {

    int temp; cin >> temp;

    myset.insert(temp);

  }

  cout << myset.size() << endl;

  for(set<int>::iterator it = myset.begin(); it != myset.end(); ++it)

  cout << *it << " ";

  return 0;

}

3

给出两个数集,它们的相似程度定义为Nc/Nt*100%。其中,Nc表示两个数集的交集中元素的个数,而Nt表示两个数集的并集中元素的个数。请计算任意两个给出数集的相似程度。Input输入第一行给出一个正整数N(N<=50),是集合的个数。随后N行,每行对应一个集合。每个集合首先给出一个正整数M(M<=5000),是集合中元素的个数;然后跟M个[0, 3000]区间内的整数。之后一行给出一个正整数K(K<=800),随后K行,每行对应一对需要计算相似度的集合的编号(集合从1到N编号)。数字间以空格分隔。Output输出共K行,每行一个保留2位小数的实数,表示给定两个集合的相似度值。

Sample Input

3

3 99 87 101

4 87 101 5 87

7 99 101 18 5 135 18 99

2

1 2

1 3

Sample Output

50.00%

33.33%

用一个vector,里面存放set,每行数都存入set中,达到去重的目的。计算相似度时,将要计算的两个set存入一个新的set。该新set中的数据就是两个set的并集。两个set数据个数之和与并集个数的差,就是交集中数据的个数。

#include <bits/stdc++.h>
using namespace std;

int main(){
  int n = 0; cin >> n;
  vector<set<int> > nums(n);
  for(int i = 0; i < n; ++i) {
    int k = 0;  cin >> k;
    for(int j = 0; j < k; ++j) {
      int temp = 0; cin >> temp;
      nums[i].insert(temp);
    }
  }
  int q = 0;  cin >> q;
  for(int i = 0; i < q; ++i) {
    int a = 0, b = 0; cin >> a >> b;
    set<int> mySet;
    for(int i = 0; i < nums[a - 1].size(); ++i) {
      for(set<int> :: iterator it = nums[a - 1].begin(); it != nums[a - 1].end(); ++it) {
        mySet.insert(*it);
      }
    }
    for(int i = 0; i < nums[b - 1].size(); ++i) {
      for(set<int> :: iterator it = nums[b - 1].begin(); it != nums[b - 1].end(); ++it) {
        mySet.insert(*it);
      }
    }
    int bing = mySet.size();
    int jiao = (nums[a -1].size() + nums[b - 1].size()) - bing;
    cout<<fixed;
    cout << setprecision(2) << double(jiao)/bing * 100 << "%" << endl;
  }
  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值