链家的笔试题:
输入如下的数据,第一行为总行数,之后每一行的第一个数为这一行除它之外元素的个数。求后续元素有多少不同的值。
输入:
3
1 1
2 1 2
3 1 2 3
输出:
3
考试的时候头大了,一着急就想用暴力法,结果直接GG,想的是把后续的数存在一个int型的数组里,再把这个数组排序,之后找出有多少不同的数,时间复杂度为O(n^2)而且还有几个O(n)的小部分,AC只有10%...就感觉很蠢....
int main()
{
int a;
cin >> a;
int zla[1000] = { 0 };
int m = 0;
for (int i = 0; i<a; i++)
{
int b;
cin >> b;
for (int j = 0; j<b; j++)
{
int temp;
cin >> temp;
zla[m] = temp;
m++;
}
}
auto temp = 0;
for (int i = 0; i<m - 1; i++)
for (int j = 0; j<m - 1; j++)
{
if (zla[j]>zla[j + 1])
{
temp = zla[j + 1];
zla[j + 1] = zla[j];
zla[j] = temp;
}
}
int k = 1;
int kk = 0;
for (int i = 0; i<m - 1; i++)
{
kk = zla[i];
if (kk != zla[i + 1])
k++;
}
cout << k << endl;
int ff;
cin >> ff;
return 0;
}
后来才想到可以用set但是已经来不及了....
set作为关联容器,直接可以去重,所以把后续的值直接放在set中,最后输出a.size()就可以知道结果了。
int main()
{
int n,k,temp;
cin >> n;
set<int> zla;
for (int i = 0; i < n; i++)
{
cin>> k;
for (int j = 0; j < k; j++)
{
cin >> temp;
zla.insert(temp);
}
}
cout << zla.size() << endl;
cin >> k;
return 0;
}