幻方矩阵

一天蒜头君买了一个幻方矩阵,这个矩阵每次可以交换任意两行或者任意两列。花椰妹看到说这么简单的东西,我自己就可以编程实现了。蒜头君要强地说这么简单我肯定也会,但是蒜头君并不会,只好求助你来编程实现。

输入格式

第一行输入两个整数 n,m,表示这个幻方矩阵大小为 n×m。

接下来是一个 n×m 的矩阵。

接下来一行有一个整数 op,表示有 op 次操作。

接下来 op 行,每行有三个整数 x,y,z。

当 x=0 的时候表示交换第 y 行和第 z 行。

当 x=1 的时候表示交换第 y 列和第 z 列。

输出格式

输出交换后的矩阵。

数据范围

对于 30% 的数据,1≤n,m,op≤100。

对于 60% 的数据,1≤n,m,n×m≤10的5次方,1≤op≤100。

对于 100% 的数据,1≤n,m,n×m,op≤10的5次方,1≤ 矩阵中每个数字的大小 ≤10的6次方。

实现代码

比较简单的一道题,在使用动态数组之前是过不了测试点的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
int **a=new int*[n];
for(int i=0;i<n;++i)
a[i]=new int[m];
for(int i=0;i<n;++i)
for(int j=0;j<m;++j)
cin>>a[i][j];
int op;
cin>>op;
int x,y,z;
for(int i=0;i<op;++i)
{
cin>>x>>y>>z;
if(!x)//x==0
for(int j=0;j<m;++j)
swap(a[y-1][j],a[z-1][j]);
else//x==1
for(int j=0;j<n;++j)
swap(a[j][y-1],a[j][z-1]);
}
for(int i=0;i<n;++i)
{
for(int j=0;j<m-1;++j)
cout<<a[i][j]<<" ";
cout<<a[i][m-1];
if(i!=n-1) cout<<endl;
}
for(int i=0;i<n;++i)
delete []a[i];
delete []a;
return 0;
}

话题焦点人物

微博提供了一种便捷的交流平台。一条微博中,可以提及其它用户。例如你发出一条微博为:“期末考试顺利 @蒜头君 @花椰菜”,则你提及了蒜头君和花椰菜两位用户。

我们收集了 N(1<N<10000) 条微博,并已将其中的用户名提取出来,用小于等于100 的正整数表示。

通过分析这些数据,我们希望发现大家的话题焦点人物,即被提及最多的人(如果有多个,找到编号最小的),并找出那些提及它的人。

输入格式

输入共两部分:

第一部分是微博数量 N,1<N<10000。

第二部分是 N 条微博,每条微博占一行,表示为:

发送者序号 a,提及人数 k(0≤k≤20),然后是 k 个被提及者序号 1,2…b1​,b2​…bk​;其中 a 和 1,2…b1​,b2​…bk​ 均为大于 0 小于等于 100 的整数。相邻两个整数之间用单个空格分隔。

输出格式

输出分两行:

第一行是被提及最多的人的序号;

第二行是提及它的人的序号,从小到大输出,相邻两个数之间用单个空格分隔。同一个序号只输出一次。

实现代码

在这之前,我需要说明的是,我自己的代码仅仅通过了一个测试点,代码里依旧有问题没有解决,不过我认识到自己的代码过于垃圾我的数据结构构建有大问题,然后在网上找到了一份参考答案,和我的思路一致,但在数据结构的规划上比我的好得多,各位可以看原文->

题目 - 话题焦点

然后呢,这是我在看了Grausam的博客后修改的代码(:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int N,a[101][101],m,mm;
cin>>N;
int qwq=0;
for(int i=0;i<101;++i)
for(int j=0;j<101;++j)
a[i][j]=0;
int awa=0;
for(int i=0;i<N;++i)
{
cin>>mm>>m;
int l;
//cout<<"l输入成功"<<endl;
for(int j=0;j<m;++j)
{
cin>>l;
a[mm][l]++;
//cout<<l<<"出现了"<<k[l]<<"次了,"<<l<<"的输入者是"<<mm<<endl;
}
}
int max = 1;
for (int i = 1; i <= 100; i++)
{
for (int j = 1; j <= 100; j++)
a[0][i] += a[j][i];
if (a[0][i] > a[0][max])
max = i;
}
cout<<max<<endl;
for(int i=1;i<=100;++i)
if(a[i][max]) cout<<i<<" ";
return 0;
}

我原本的10分代码里有好几个数组,我对自己的垃圾代码的评价是:纯粹的模拟是行不通的。