A Subsequence Permutation

题目大意

给你一个长度为n的字符串,确定一个最小数字k,将k个字符重新排列后字符串有序

主要思路

记录原字符串,记录排序后的字符串,遍历如果有一个字符不相等ans++,输出ans

AC代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N = 200010;
  5. int n, a[N];
  6. char s[N], s1[N];
  7. int main()
  8. {
  9. int T;
  10. cin >> T;
  11. while(T--)
  12. {
  13. cin >> n;
  14. for(int i = 0; i < n; i++)
  15. {
  16. cin >> s[i];
  17. s1[i] = s[i];
  18. }
  19. sort(s, s + n);
  20. int res = 0;
  21. for(int i = 0; i < n; i++)
  22. {
  23. if(s[i] != s1[i]) res++;
  24. }
  25. cout << res << endl;
  26. }
  27. return 0;
  28. }

B Running for Gold

题目大意

给你n个运动员,每个运动员有5场比赛排名,当x运动员至少有3场比赛比y运动员排名低时说明x运动员优于y运动员,请找出n个运动员中比其他运动员都优秀的运动员,如果不存在输出-1

主要思路

先从1n遍历,假如有比当前运动员更优秀的输出-1

AC代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N = 50010;
  5. int n, a[N][10];
  6. bool check(int x, int y)
  7. {
  8. int cnt = 0;
  9. for(int i = 1; i <= 5; i++)
  10. {
  11. if(a[x][i] < a[y][i]) cnt++;
  12. }
  13. if(cnt >= 3) return true;
  14. return false;
  15. }
  16. int main()
  17. {
  18. int T;
  19. cin >> T;
  20. while(T--)
  21. {
  22. cin >> n;
  23. for(int i = 1; i <= n; i++)
  24. {
  25. for(int j = 1; j <= 5; j++)
  26. {
  27. cin >> a[i][j];
  28. }
  29. }
  30. int res = 1;
  31. for(int i = 2; i <= n; i++)
  32. {
  33. if(check(i, res)) res = i;
  34. }
  35. int t = res;
  36. for(int i = 1; i <= n; i++)
  37. {
  38. if(i == res) continue;
  39. if(check(res, i)) ;
  40. else t = -1;
  41. }
  42. cout << t << endl;
  43. }
  44. return 0;
  45. }

C Maximize the Intersections

题目大意

给你一个数n,圆上有顺时针的2 * n个点,给你了n条线段,问剩下的点怎么连使得线段交点最多,每个点只能被用一次。

主要思路

首先考虑两线段之间有交点满足什么条件,(x1, y1) (x2, y2) (x1 < y1, x2 < y2)当两线段相交时,一定满足x1 < x2 < y1 < y2或者x2 < x1 < y2 < y1,那么我们把剩余没被用过的点排序,想办法构成最多的相交序列,于是我们可以将排序后的数组前半段和后半段分开,每次从前半段和后半段按顺序取一个数凑成一条线段,这样构造出来的线段交叉最多,也就是交点最多

AC代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define x first
  4. #define y second
  5. typedef long long ll;
  6. const int N = 1010;
  7. int n, k;
  8. pair<int, int> p[N];
  9. bool st[N];
  10. int num[N];
  11. bool check(int a, int b)
  12. {
  13. if(p[a].x < p[b].x && p[a].y < p[b].y && p[b].x < p[a].y || p[b].x < p[a].x && p[b].y < p[a].y && p[a].x < p[b].y) return true;
  14. else return false;
  15. }
  16. int main()
  17. {
  18. int T;
  19. cin >> T;
  20. while(T--)
  21. {
  22. memset(st, 0, sizeof(st));
  23. cin >> n >> k;
  24. for(int i = 0; i < k; i++)
  25. {
  26. int a, b;
  27. cin >> a >> b;
  28. if(a > b) swap(a, b);
  29. p[i] = {a, b};
  30. st[a] = st[b] = true;
  31. }
  32. int cnt = 0;
  33. for(int i = 1; i <= 2 * n; i++)
  34. {
  35. if(!st[i]) num[cnt++] = i;
  36. }
  37. for(int i = 0; i < cnt / 2; i++)
  38. {
  39. p[k++] = {num[i], num[i + cnt / 2]};
  40. }
  41. //for(int i = 0; i < n; i++) cout << p[i].x << ' ' << p[i].y << endl;
  42. ll res = 0;
  43. for(int i = 1; i < n; i++)
  44. {
  45. for(int j = 0; j < i; j++)
  46. {
  47. if(check(i, j)) res++;
  48. }
  49. }
  50. cout << res << endl;
  51. }
  52. return 0;
  53. }

D Array Differentiation

题目大意

给定一个长度为n的a数组,问你能否构造出一个长度为n的数组b,满足b中存在两个数的差为a数组中的元素,且a数组中的元素必须都出现

主要思路

先考虑如何构造数组b,假设b中存在一个数x,根据与a数组的关系,我们必然构造下一个数为x + a[i],那么当我们遍历到a数组的第n - 1位时,b数组已经长度为n,那么如何才能构造出数组b呢,可以想到,如果a中的一个数能被其他数表示出来,也就是a数组中任意个元素能凑出的数中存在重复元素,那么一定能构造出数组b,n的数据范围为10,所以我们用2进制枚举a数组选与不选的所有状态,找到所有可能的值,如果存在重复元素输出YES,否则输出NO

AC代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define x first
  4. #define y second
  5. typedef long long ll;
  6. const int N = 500010;
  7. int n, k;
  8. ll a[N];
  9. int main()
  10. {
  11. int T;
  12. cin >> T;
  13. while(T--)
  14. {
  15. cin >> n;
  16. for(int i = 0; i < n; i++)
  17. {
  18. cin >> a[i];
  19. }
  20. set<int> s;
  21. for(int i = 0; i < 1 << n; i++)
  22. {
  23. int sum = 0;
  24. for(int j = 0; j < n; j++)
  25. {
  26. if((i >> j) & 1) sum += a[j];
  27. }
  28. s.insert(sum);
  29. }
  30. if(s.size() < 1 << n) puts("YES");
  31. else puts("NO");
  32. }
  33. return 0;
  34. }