• CF1244G Running in Pairs


    CF1244G Running in Pairs

    题目的字面意思

           改变两个序列的顺序,然后使得sum(max(a[i], b[i]))是小于等于 m 的最大值,输出这样的两个序列,不行就输出 -1。A序列和B序列都是从1 到 n。

      n 的范围时候 2e5   m 的范围是 n 到 n2

    例如

    1 2 3 4 5

    5 4 3 2 1

    这样组合那么 sum 值就是 21

    先来考虑需要输出 -1 的情况

    1 2 3 4 5

    1 2 3 4 5

    这样的组合就是最小的情况, 也就是(n + 1)* n  /  2 是一个极限值,如果m小于这个极限值, 就是不存在可行的组合

    然后我们来思考可行的方法,可以先计算这个m值到最小值的差值,然后从后往前去凑答案就可以,本质是一个构造。

    具体请看我丑陋的代码。

     1 #include <stdio.h>
     2 #include <algorithm>
     3 using namespace std;
     4 typedef long long ll;
     5 int ans[1000009];
     6 int main()
     7 {
     8     ll n, m, minn, diff, pos;
     9     scanf("%lld %lld", &n, &m);
    10     minn = (1+n) * n / 2;
    11     if(m<minn) printf("-1\n");
    12     else{
    13         diff = m - minn;
    14         pos = 1;
    15         for(int i = 1; i <= n; i++) ans[i] = i;
    16         for(int i = n; i > pos && diff; i--)
    17         {
             // 模拟替换的过程
    18 if(i-pos<=diff) 19 { 20 diff -= (i - pos); 21 swap(ans[i], ans[pos]); 22 pos++; 23 }else{ 24 swap(ans[i], ans[i-diff]); 25 diff = 0; 26 } 27 } 28 printf("%lld\n", m - diff); 29 for(int i = 1; i <= n; i++) 30 printf("%d%c", i, i==n?'\n':' '); 31 for(int i = 1; i <= n; i++) 32 printf("%d%c", ans[i], i==n?'\n':' '); 33 } 34 }
  • 相关阅读:
    dispatch_semaphore
    dispatch_set_target_queue
    iOS charles支持https抓包
    ios8 毛玻璃效果
    工程里配置.xconfig文件
    线程安全的nsmutabledictionary(读weex代码)
    关于信号量以及多线程的代码
    dispatch_set_target_queue测试
    dyld: Library not loaded问题解决
    iOS图片上加标签或者水印
  • 原文地址:https://www.cnblogs.com/loenvom/p/11876388.html
Copyright © 2020-2023  润新知