A. PlayoffB. Prove Him WrongC. Fault-tolerant NetworkD. Nearest Excluded Points
A. Playoff传送门
题目大意:输入一个整数n,就有2n个人进行分组比赛,第一轮:12一组,34一组,…,2n-1和2n一组,当一组内编号连续则胜者为编号小的那个,否则胜者为编号高的那个。
解题思路:很明显最后胜者始终为最大的奇数即2n-1
输入样例
2 3 1
输出样例
7 1
#includeB. Prove Him Wrongusing namespace std; typedef long long ll; const int N = 31; ll a[N]; int main() { int t; cin >> t; a[0] = 1; for(int i = 1 ; i < N ; i++){ a[i] = a[i - 1] * 2; } while(t--){ int n; cin >> n; cout << a[n] - 1 << endl; } return 0; }
传送门
输入样例
3 2 512 3
输入样例
YES 1 337 NO YES 31 4 159
题目大意:对于一个长度为n的数组a,一定能找到两个下标i,j,令a[i]=a[j]=|a[i]-a[j]|,数组a的总和会减少,我们要证明这个结论是错误的。输入一个n为数组的长度,如果有一个数组a,a中的元素不能大于1e9,进行任意这样的操作最后数组a的总和增加或不变,就输出数组a,否则输出NO。
解题思路:将题目的意思转换为不等式即我们要找到一个a[i],a[j]使得:
a[i]+a[j] <= 2 * |a[i]-a[j]| =>
a[i]+a[j] <= 2 * a[j] - 2 * a[i] =>
3a[i] <= a[j] =>
a[i] <= 1/3 * a[j]
所以第二个数只要是第一个数的3倍及以上,那么二者差值的2倍一定大于二者之和,那么我们就可以得到一个序列1 3 9 27 … 直到大于1e9,如果遇到第一个a[m] > 1e9那么输入的n如果大于等于m就输出No,否则输出Yes,所以我们需要先预处理一下
#includeC. Fault-tolerant Networkusing namespace std; const int N = 1002; typedef long long ll; ll a[N]; int main() { int t; cin >> t; a[1] = 1; int flag = 0; for(int i = 2 ; i < 1002 ; i++ ){ if(!flag){ a[i] = a[i - 1] * 3; } if(a[i] * 3 > 1e9 && !flag){ flag = i; } } while(t--){ int n; cin >> n; if(n > flag){ cout << "NO"; }else{ cout << "YES" << endl; for(int i = 1 ; i <= n ; i++){ cout << a[i] << " "; } } cout << endl; } return 0; }
传送门
输入样例
2 3 1 10 1 20 4 25 4 1 1 1 1 1000000000 1000000000 1000000000 1000000000
输出样例
31 1999999998
题目大意:有两排电脑,每排电脑的个数为n,每排的电脑网络都是互通的(假设第一排的电脑为数组a,第二排为数组b),如a1连接a2,a2连接a3,…,an-1连接an,b也是一样。但是ab互不连通,现在需要你将a和b连接起来,每次连接都会花掉|ai-bj|,并保证a和b任意一台电脑挂掉了,a和b的网络连接不会断也不会出现某台电脑被孤立同时花费最小。
解题思路:通过分析我们可以知道,边界电脑a1,an,b1,bn必须被连接,如果a1没有被连接,那么假设a2挂掉了,a1就会成为孤立的点,同时我们也只需要让这四个点被连接,这样无论哪个的电脑挂掉都能保证两排电脑的每两个都能互通。可以抽象成一个矩形,如果有条边断掉,也还是一根线,不会断成两根线。 传送门 输出样例1 输入样例2 输出样例2 题目大意:给你一个点集,对于每个点输出不在点集内并且距离该点曼哈顿距离最近的点,曼哈顿距离distance = |x1-x2|+|y1-y2|
那么如何保证这四个点都被连接并且花费最小呢,这就需要枚举了。首先对于a1,有三种连接情况:b1,bn,bi:min(|a1-bi|)(i>1&i#include
D. Nearest Excluded Points
输入样例16
2 2
1 2
2 1
3 2
2 3
5 5
1 1
1 1
2 0
3 1
2 4
5 4
8
4 4
2 4
2 2
2 3
1 4
4 2
1 3
3 3
8
4 4
2 4
2 2
2 3
1 4
4 2
1 3
3 3
解题思路:采用bfs,首先遍历点集,对于一个点(x,y),曼哈顿距离最近为1,那么就遍历该点四个方向的点,如果找到一个点不在点集内就将(x,y)加入队列然后break。如果一个点四个方向的点都在点集内,那么与它曼哈顿距离最近的就是它四个方向中的点中曼哈顿距离最近的,可能有点绕,你可以想象假设一个点,他四个方向的点都在点集内,那么曼哈顿距离最近的点就变成外围点中曼哈顿距离最近的点,那么这个曼哈顿距离就变成2,因为曼哈顿距离为1的点都不能取。最后遍历整个队列,相当于这个队列的初始值就是整个图中最外围的点,那么里面的点就迭代更新为外围曼哈顿距离最近的点的答案。里面的点的答案就是外围点的答案。不停地迭代,最终每个点曼哈顿距离最近且不再点集内的答案就出来了。#include



