• Codeforces Round #666 (Div. 2) Power Sequence、Multiples of Length 思维


    题目链接:Power Sequence

    题意:

    给你n个数vi,你可以对这个序列进行两种操作

    1、可以改变其中任意个vi的位置,无成本

    2、可以对vi进行加1或减1,每次操作成本为1

    如果操作之后的vi(设v数组下标从1到n)满足:如果存在一个数c,使得每一个vi都满足vi==ci

    你需要输出这个满足题意得vi数组构成所需的最小成本

    题解:

    题目要求1<=ai<1e9,那么可以说所有vi都加起来得数量级是1e9,那么也就说如果cn,那么c这个数就不可取

    因为我们c可以取1,那么成本最大也是在1e9数量级

    所以就暴力枚举c因子就行,这个c得范围我随便定了一个范围,具体见代码

    代码:

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<algorithm>
     4 #include<iostream>
     5 using namespace std;
     6 typedef long long ll;
     7 const int maxn=1e5+10;
     8 const int INF=1e9;
     9 char s[maxn];
    10 ll v[maxn];
    11 long long pf(ll a, ll b)
    12 {
    13     ll res = 1;
    14     while (b--)
    15         res *= a;
    16     return res;
    17 }
    18 int main()
    19 {
    20     ll n;
    21     scanf("%lld",&n);
    22     v[0]=1;
    23     for(ll i=1; i<=n; ++i)
    24     {
    25         scanf("%lld",&v[i]);
    26     }
    27     sort(v+1,v+n+1);
    28     ll sum;
    29     sum=100000000000000;
    30     if (n >= 36)
    31     {
    32         sum = 0;
    33         for (ll i = 1; i <= n; i++)
    34             sum += v[i] - 1;
    35         printf("%lld
    ", sum);
    36         return 0;
    37     }
    38     for (ll k = 1; k <= 100000; k++)
    39     {
    40         long long temp = 0, flag = 1,tmp=1;
    41         for (ll i = 1; i <= n; i++)
    42         {
    43             if (tmp >= n * 1000000000)
    44             {
    45                 flag = 0;
    46                 break;
    47             }
    48             temp += abs(v[i] - tmp);
    49             tmp*=k;
    50         }
    51         if (flag)
    52             sum = min(temp, sum);
    53     }
    54     printf("%lld
    ",sum);
    55     return 0;
    56 }
    View Code

    题目链接:Multiples of Length

    题意:

    给你n个数vi,每次操作你可以选取一个区间[l,r],区间长度len=r-l+1,那么你可以对这个区间内的vi加上len的倍数,这个倍数可以是负数,即-1*len

    你必须要在3个操作内使得所有vi变为0,请输出这3个操作

    题解:

    我们设v数组下标从1到n,你可以先对区间[1,n-1]上的vi都加上(n-1)*vi,那么再使v[n]变成n*v[n]。那么最后在对区间[1,n]内的所有vi减去n*vi就行

    代码:

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<algorithm>
     4 #include<iostream>
     5 using namespace std;
     6 typedef long long ll;
     7 const int maxn=1e5+10;
     8 const int INF=1e9;
     9 ll v[maxn];
    10 int main()
    11 {
    12     ll n;
    13     scanf("%lld",&n);
    14  
    15     for(ll i=1;i<=n;++i)
    16     {
    17         scanf("%lld",&v[i]);
    18     }
    19     if(n==1)
    20     {
    21         printf("1 1
    ");
    22         printf("%lld
    ",-1*v[1]);
    23         printf("1 1
    0
    ");
    24         printf("1 1
    0
    ");
    25         return 0;
    26     }
    27     printf("1 %lld
    ",n-1);
    28     for(ll i=1;i<n;++i)
    29     {
    30         if(i==n-1)
    31             printf("%lld
    ",(n-1)*v[i]);
    32         else printf("%lld ",(n-1)*v[i]);
    33     }
    34  
    35     printf("%lld %lld
    ",n,n);
    36     printf("%lld
    ",n*v[n]-v[n]);
    37  
    38     printf("1 %lld
    ",n);
    39     for(ll i=1;i<=n;++i)
    40     {
    41         if(i==n)
    42             printf("%lld
    ",-1*n*v[i]);
    43         else printf("%lld ",-1*n*v[i]);
    44     }
    45     return 0;
    46 }
    View Code
  • 相关阅读:
    内存队列使用Channels
    笔记20210101mongodb
    管道式的开发模式
    企业级应用架构设计
    再入历史旧坑
    路径问题 再次记录
    mongdb驱动的问题
    使用Bumblebee记录
    我和小兔子不得不说的消息v2
    流程设计器jQuery + svg/vml(Demo7
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/13590668.html
Copyright © 2020-2023  润新知