题目链接:https://pintia.cn/problem-sets/994805046380707840/exam/overview
帅到没朋友
思路
如果
i
d
id
id 号为
x
x
x 的人在大小超过
1
1
1 的朋友圈,那么这个人不是“帅到没朋友的人”,标记为
b
[
x
]
=
1
b[x]=1
b[x]=1。
然后读入查询
i
d
id
id,如果
b
[
i
d
]
=
0
b[id]=0
b[id]=0,说明是“帅到没朋友的人”,如果未输出过输出该
i
d
id
id,然后标记
c
[
i
d
]
=
1
c[id]=1
c[id]=1 表示该
i
d
id
id 输出过。
复杂度
时间复杂度为 O ( k ) O(k) O(k)
代码实现
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, m;
int b[N], c[N];
int main()
{
cin >> n;
for (int i = 1; i <= n; i++) {
int k;
cin >> k;
for (int j = 1; j <= k; j++) {
int x;
cin >> x;
if (k > 1)
b[x] = 1;
// 如果朋友圈大小k>1,则标记为不是“帅到没朋友的人”
}
}
cin >> m;
int f = 0;
for (int i = 1; i <= m; i++) {
int x;
cin >> x;
if (!b[x] && !c[x]) {
c[x] = 1;
// 标记已经输出
if (f)
cout << ' ';
printf("%05d", x);
f = 1;
}
}
if (!f) {
cout << "No one is handsome";
}
}
连续因子
思路
用试除法找出
n
n
n 的所有因子,然后对因子进行排序,枚举每个因子
x
x
x 作为连续因子的序列的开头,从
x
x
x 开始向后累乘
x
+
1
,
x
+
2
,
.
.
.
x+1,x+2,...
x+1,x+2,...。
如果累乘到
x
+
i
x+i
x+i,乘积不为为
n
n
n 的因子,则
x
+
i
−
1
x+i-1
x+i−1 为以
x
x
x 开头的连续因子序列的结尾。
记录最长的且字典序最小的连续因子序列即为答案。
复杂度
空间复杂度 O ( n ) O(\sqrt n) O(n),时间复杂度 O ( n n ) O(n\sqrt n) O(nn)
代码实现
#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
int n;
cin >> n;
vector<int> all;
for (int i = 1; i <= n / i; i++) {
if (n % i == 0) {
if (i != 1)
all.push_back(i);
if (n / i != i)
all.push_back(n / i);
}
}
sort(all.begin(), all.end());
vector<int> ans;
for (int i = 0; i < all.size(); i++) {
int j = i;
vector<int> cur;
int x = 1;
while (j < all.size() && all[j] - all[i] == j - i) {
x *= all[j];
// 注意这里应当是判断连续因子的乘积是否是n的因子
// 起初判断写成了"x>n".....
if (n%x!=0)
break;
cur.push_back(all[j++]);
}
// 因为因子从小到大枚举,所以第一次遇到某个长度的序列,一定是字典序最小的
if (cur.size() > ans.size()) {
ans = cur;
}
}
cout << ans.size() << '\n';
int f = 0;
for (int x : ans) {
if (f)
cout << "*";
cout << x;
f = 1;
}
}