首页 > 其他分享 >Codeforces Round #840 (Div. 2) C

Codeforces Round #840 (Div. 2) C

时间:2022-12-20 21:58:35浏览次数:34  
标签:840 int Codeforces 变成 abs ans Div include mx

这一道题也是我没想到的

题目大意是这样的:可以选择i,j(i<j),我们可以把i到j包括i,j的元素换成abs(a[i],a[j]) ,并且我们需要的答案就是经过一系列这样的操作,使得这个数组的和最大,并输出这一个最大值

我先前一直在想最大值和最小值的差,这样就会让这个差值最大,但是这样还要考虑这样改变划算吗,其他的地方呢?

其实不用这么复杂。

我们可以先考虑n>4的情况

我们第一步可以让a[1],a[2]变成abs(a[1]-a[2]),这样a[1]==a[2],在让a[1]=a[2]=abs(a[1]-a[2]) =0;

下一步就是按这样的方式把a[n]和a[n-1]变成了0

最后一步就是把从1到n的都变成这个数组原来的最大的那个mx,因为abs(mx-0)=mx,这也就是我为什么一定要n>4

如果mx在第1个位置上,那就更好办了,只要把a[n]和a[n-1]变成0了就可以了,mx在最后一个位置也是同样的道理。

如果n==3,那么有以下几种改变方法

1.a[1]和a[2]变成abs(a[1]-a[2]),ans=abs(a[1]-a[2])*2+a[3]

2.a[2]和a[3]变成abs(a[3]-a[2]),ans=abs(a[3]-a[2])*2+a[1]

3.a[1]和a[2]变成0,a[1]=a[2]=a[3] ,ans=a[3]*3

4.a[2]和a[3]变成0,a[2]=a[3]=a[1], ans=a[1]*3

5.先把a[1]变成abs(a[1]-a[2]) ,然后在把a[2],a[3]都变成0,最后a[1]=a[2]=a[3]=abs(a[1]-a[2])(最开始的a[1],a[2]),

ans=abs(a[1]-a[2])*3

6.先把a[3]变成abs(a[3]-a[2]) ,然后在把a[2],a[1]都变成0,最后a[1]=a[2]=a[3]=abs(a[3]-a[2])(最开始的a[3],a[2]),

ans=abs(a[3]-a[2])*3

最后两种可能比较难想到,反正我是没想到

如果n==2

ans=max(a[1]+a[2],abs(a[1]-a[2])*2)//直接判断
后来知道了它获得最大和的方式,就觉得很妙,我在vp的时候真是没什么思路

#include <iostream>
#include <stdlib.h>
#include <cmath>
using namespace std;
const int maxn=2e5+10;
#define int long long 
int n,t;
int a[maxn];
void solve()
{
    cin>>n;
    int mx=-1;
    for (int i=1;i<=n;i++)
    {
        cin>>a[i];
        mx=max(mx,a[i]);
    }
    if (n>3)
    {
        cout<<mx*n<<'\n';
    }
    else if (n==2)
    {
        cout<<max(a[1]+a[2],abs(a[1]-a[2])*2)<<'\n';
    }
    else 
    {
        int ans=max(a[1],a[3]);
        ans=ans*3;
        ans=max(ans,a[1]+a[2]+a[3]);
        ans=max(ans,abs(a[1]-a[2])*3);
        ans=max(ans,abs(a[3]-a[2])*3);
        ans=max(ans,abs(a[1]-a[2])*2+a[3]);
        ans=max(ans,abs(a[3]-a[2])*2+a[1]);
        cout<<ans<<'\n';
    }
    return ;
}
signed main ()
{
    cin>>t;
    while (t--)
    {
        solve();
    }
    system ("pause");
    return 0;
}

标签:840,int,Codeforces,变成,abs,ans,Div,include,mx
From: https://www.cnblogs.com/righting/p/16995168.html

相关文章

  • Codeforces 1763 F Edge Queries 题解
    题目链接先观察满足题目中给出的限制的图有什么特点。先看\(C_u\),它指的是所有与\(u\)在同一个简单环内的节点。发现一个点v在\(C_u\)中,当且仅当\(u,v\)点双连通。关于点......
  • Codeforces Round #835 (Div. 4) ABCDEF(二分)
    https://codeforces.com/contest/1760【赛时A-E代码】A.MediumNumber题目大意:三个数字,求第二大的数字。input952614342021123111912108206......
  • Codeforces 1774
    A-AddPlusMinusSign简单题,直接\(\tt-\)和\(\tt+\)交替就好了。缺省源没有。intsolve(){ intn=getInt(); strings; cin>>s; boolb=(s[0]==1......
  • Codeforces Round #840 (Div. 2) and Enigma 2022 - Cybros LNMIIT AB
    (:我一开始以为我要爆0了,跌,磕磕绊绊,还好写出了这两题,后面的太难了题目都没看hhhttps://codeforces.com/contest/1763A.AbsoluteMaximization题目大意:给定一个数组a,我......
  • Codeforces Round #839 (Div. 3) ABCD
    昨晚忙着找py数据分析入门了,又......
  • KL divergence
    Kullback-Leiblerdivergence 性质:非负P=Q时,D[P||Q]=0不对称性:D(P||Q)≠D(Q||P) 自信息:符合分布P的某一事件x出现,传达这条信息所需的最少信息长度为自信息,表达为熵:从......
  • Educational Codeforces Round 140 (Rated for Div. 2)
    A题意:给定二维坐标的三个顶点构成一个三角形。请问能否用一条平行于坐标轴的线段将三角形分割成两个非退化的三角形。核心思路:只有一种情况是无法分割的,那就是是一个直......
  • Codeforces Polynomial Round 2022 (Div.1 + Div.2) CF 1774 题解
    A.AddPlusMinusSign如果有偶数个1,显然可以通过加减各一半的方式达到和为0;否则可以达到和为1。需要注意如果序列的第一个数是1,则它的前面只能填加号。时间复杂度\(O(n......
  • Codeforces Polynomial Round 2022 (Div.1 + Div.2) CF 1774 题解
    A.AddPlusMinusSign如果有偶数个1,显然可以通过加减各一半的方式达到和为0;否则可以达到和为1。需要注意如果序列的第一个数是1,则它的前面只能填加号。时间复杂度\(O(n......
  • Codeforces Polynomial Round 2022 (Div.1 + Div.2) CF 1774 题解
    A.AddPlusMinusSign如果有偶数个1,显然可以通过加减各一半的方式达到和为0;否则可以达到和为1。需要注意如果序列的第一个数是1,则它的前面只能填加号。时间复杂度\(O(n......