文章目录
- A. Make All Equal
- 题目描述
- 思路
- 代码
- B. Generate Permutation
- 题目描述
- 思路
- 代码
- C. Guess The Tree
- 题目描述
- 思路
- 代码
A. Make All Equal
题目描述
一个数组,最多实行n-1次,计算最少多少次可以变为同一个数
思路
计算重复次数最多的数,用总数减去重复最多的就行
代码
signed main()
{
int t;
cin >> t;
while (t--)
{
int n; int c = 0;
cin >> n;
int a[n + 5];
int b[n + 5];
fill(b, b + n + 5, 0);//重置
for (int i = 0; i < n; i++)
cin >> a[i];
for (int i = 0; i < n; i++)
{
b[a[i]]++;//计算最大重复次数
c = max(c, b[a[i]]);//更新最大次数
}
cout << n - c << '\n';
}
return 0;
}
B. Generate Permutation
题目描述
思路
偶数的时候不行,直接输出‘-1’;
奇数就可以第一个数输出x,每次减2,输出1,再每次加2,直到输出次数等于x(这个是观察样例三观察出来的)
代码
signed main()
{
int t;
cin >> t;
while (t--)
{
int x; cin>>x;
int f=0; int n=x;
if(x==1)
cout<<"1"<<'\n';
else if(x%2==0)
cout<<"-1"<<'\n';//按照上述思路,最中间的两个数,不同的方向注定是不同的,所以转化次数肯定不一样
else
{
while(x>=1)
{
cout<<x<<' ';
x-=2;
f++;//记录重复次数
}
x=2;
while(f<n)//这里要用一个新变量,把n的值
{
cout<<x<<' ';
x+=2;
f++;
}
}
}
return 0;
}
C. Guess The Tree
题目描述
这是一个互动问题。
Misuki 选择了一棵有 n 个节点、索引从 1 到 n的秘密树,并要求你使用以下类型的查询来猜测它:
“? a b” - Misuki 会告诉你哪个节点 x最小化了 |d(a,x)−d(b,x)| ,其中 d(x,y) 是节点 x 和 y
之间的距离。如果存在多个这样的节点,那么 Misuki 会告诉您哪个节点使 d(a,x) 最小。
最多使用 15n 次查询即可找出三幸秘密树的结构!
思路
这是个交互题,平时没怎么见,需要好好学习一下
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int fa[N];
int idx;
int from[N], to[N];
int find(int x)
{
if (fa[x] != x)
fa[x] = find(fa[x]);
return fa[x];
}
int main()
{
int T;
cin >> T;
while (T--)
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
fa[i] = i;
idx = 0;
int x;
for (int i = 2; i <= n; i++)
{
if (find(1) == find(i)) continue;
int u = 1, v = i;
while (idx < n)
{
printf("? %d %d\n", u, v);
cout.flush();
cin >> x;
if (x == u)
{
from[++idx] = u;
to[idx] = v;
fa[find(v)] = find(u);
break;
}
else if (find(u) == find(x))
u = x;
else if (find(v) == find(x))
v = x;
else
u = x;
}
}
printf("! ");
for (int i = 1; i < n; i++)
printf("%d %d ", from[i], to[i]);
cout << endl;
}
return 0;
}