• Codeforces Round #813 (Div. 2)A.B.C


    A. Wonderful Permutation

    题目链接:

    Problem - A - Codeforces

    题面:

    题意:

    你可以任意选择两个位置,然后交换两个位置上的数,问:使前k个数相加最小需要交换几次

    思路:

    我们可以统计最小的k个数有几个的位置大于等于k即可

    代码:

    1. #include
    2. using namespace std;
    3. struct node{
    4. int num;
    5. int i;
    6. }arr[105];
    7. bool cmp(node a, node b){
    8. return a.num < b.num;
    9. }
    10. int main(){
    11. int t;
    12. cin >> t;
    13. while(t--){
    14. int n, k;
    15. cin >> n >> k;
    16. for(int i = 0; i < n; i++){
    17. cin >> arr[i].num;
    18. arr[i].i = i;
    19. }
    20. sort(arr, arr + n, cmp);
    21. int ans = 0;
    22. for(int i = 0; i < k; i++){
    23. if(arr[i].i >= k){
    24. ans++;
    25. }
    26. }
    27. cout << ans << endl;
    28. }
    29. return 0;
    30. }

    B. Woeful Permutation

    题目链接:

    Problem - B - Codeforces

    题面:

    题意:

    一共有n个数,需要构造一个排列p,使得sum(lcm(i, pi))最大

    思路:

    lcm(n, n-1)一定是所有搭配里面最大的

    在区间内lcm(i, i+1)是最大的,我们只需要从大到小把两个相邻的放在一个求lcm即可

    代码:

    1. #include
    2. using namespace std;
    3. int arr[100005];
    4. int main(){
    5. int t;
    6. cin >> t;
    7. while(t--){
    8. int n;
    9. cin >> n;
    10. for(int i = n; i >= 1; i -= 2){
    11. if(i > 1){
    12. arr[i - 1] = i;
    13. arr[i] = i - 1;
    14. }else{
    15. arr[i] = i;
    16. }
    17. }
    18. for(int i = 1; i <= n; i++){
    19. if(i != 1){
    20. cout << " ";
    21. }
    22. cout << arr[i];
    23. }
    24. cout << endl;
    25. }
    26. return 0;
    27. }

    C. Sort Zero

    题目链接:

    Problem - C - Codeforces

    题面:

    题意:

    有一个n个数的数组,我们可以选择一个x找到所有ai == x的,并把ai变成0,问最少需要几步能把数组变成非递减数组

    思路:

    我们从后往前考虑,如果所有的an都是连续的,那么an就不用变成0,然后不断缩小n即可,如果an不是连续的,无论中间的数比an大还是小,我们都需要把前面所有的位置(包括n)的数变成0

    代码:

    1. #include
    2. using namespace std;
    3. int arr[100005];
    4. vector<int> ve[100005];
    5. bool vis[100005];
    6. int main(){
    7. int t;
    8. cin >> t;
    9. while(t--){
    10. int n;
    11. cin >> n;
    12. for(int i = 1; i <= n; i++){
    13. ve[i].clear();
    14. vis[i] = 0;
    15. }
    16. int num = 0;
    17. for(int i = 1; i <= n; i++){
    18. cin >> arr[i];
    19. if(vis[arr[i]] == 0){
    20. num++;
    21. }
    22. vis[arr[i]] = 1;
    23. ve[arr[i]].push_back(i);
    24. }
    25. int ans = 1e5 + 5;
    26. int cnt = 0;
    27. for(int i = n; i >= 1; i--){
    28. int a = arr[i];
    29. // cout << a << " " << ans << " : ";
    30. if(a < ans){
    31. int m = ve[a].size() - 1;
    32. bool f = 0;
    33. for(int j = 1; j <= m; j++){
    34. // cout << ve[a][m - j] << " ";
    35. if(ve[a][m - j] != i - j){
    36. f = 1;
    37. break;
    38. }
    39. }
    40. // cout << endl;
    41. if(f){
    42. break;
    43. }
    44. cnt++;
    45. ans = a;
    46. i = i - m;
    47. }else{
    48. break;
    49. }
    50. }
    51. // cout << endl;
    52. cout << num - cnt << endl;
    53. }
    54. return 0;
    55. }

  • 相关阅读:
    顺丰面试,第二个问题把我劝退了!
    Flink 基础 -- 尝试Flink
    iOS UWB——Neaby Interaction框架(一)
    JavaScript -- 02. 变量和数据类型
    【tensorboard打开失败】No dashboards are active for the current data set.
    VPS2104 小功率反激电源控制器 4-100VIN/120V/4A 功率管
    将ndarray对象的数据按索引矩阵进行选取的几种方法
    RHCE之路iptables,firewalld,富规则
    视频号视频怎么下载(视频号如何下载里面的视频)
    Python itertools模块中的combinations() 函数用法
  • 原文地址:https://blog.csdn.net/m0_55682843/article/details/126892868