【数学归纳法】【二分答案】17.1.24 T3 zhenhuan题解

版权声明:It's Maverick https://blog.csdn.net/MaverickFW/article/details/54730025

Zhenhuan

今日又在看甄嬛传,皇上觉得后宫们的勾心斗角太险恶了,有点不好,决定给每个妃子发丝带以让后宫之间和睦相处。皇上一共有N个后宫(标号为1~n),站成一个环形(1号与n号相邻),每个后宫想要ai个丝带,而且这ai个丝带颜色互不相同,而且每个妃子拥有的丝带不能与和她相邻的妃子的丝带有任何一种颜色相同。皇上不喜欢太多的颜色,所以皇上就像知道最少需要多少种颜色就能满足所有后宫的要求,设最小颜色为M,而甄嬛想提前知道M的值,以告诉皇上来赢得欢心,然而在皇上后宫太多了,她就不会了,所以呢,她向学信息奥赛的你求助,并答应事成之后奖励你
((21,000,000,006 mod 1,000,000,007 )-1)吨黄金
输入格式:
第一行一个整数n,接下来有n个数字,第i个数字为ai,表示编号为i的后宫想要ai条丝带。
输出格式:
共一行,一个整数表示M。

卖萌:
/这道题是最萌的(⊙_⊙)?我不知道/
数据范围:
40%的数据:n mod 2==0。0<=ai<=1,000,000,000;
100%的数据:n<=20000。0<=ai<=1,000,000,000;

由数据规模不难得出我们可以分类考虑。
当n mod 2 == 0时,有相邻两个妃子之和最大即为所求。
当n mod 2 == 1时,有(大概)相邻两个妃子之和最大与相邻另一个妃子最小。
但是这只有80分,我也不知道为什么(误)

这道题目有神公式。但是我不知道为什么?
先二分答案:
设为K,然后维护两个东西l[i],r[i],分别表示第i个妃子可以最少和最多与1号妃子有的相同的颜色数。如果l[n]>0则K不可行。(想想为什么~)恩,
然后r[i]=min(a[i],a[1]-l[i-1])
l[i]=max(a[1]-r[i-1]+a[i-1]+a[i]-K,0)

所以附80分代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <set>
#include <queue>
#include <algorithm>
#include <vector>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <stack>

using namespace std;

const int N = 20010;
int n,m;
int a[N];

template <class T> inline void read(T &x)
{
    x = 0;
    int flag = 1;
    char ch = (char)getchar();
    while(ch<'0' || ch>'9')
    {
        if(ch=='-') flag = -1;
        ch = (char)getchar();
    }
    while(ch>='0' && ch<='9')
    {
        x = (x<<1) + (x<<3) + ch-'0';
        ch = (char)getchar();
    }
    x *= flag;
}

void work()
{
    for(int i = 1; i < n; i++)
        if(m < a[i]+a[i+1]) m = a[i]+a[i+1];
    if(m < a[1]+a[n]) m = a[1]+a[n];
}

void work2()
{
    for(int i = 1; i < n-1; i++)
        if(m < a[i]+a[i+1]+a[i+2]) m = a[i]+a[i+1]+a[i+2];
    if(m < a[1]+a[n-1]+a[n]) m = a[1]+a[n-1]+a[n];
    if(m < a[1]+a[2]+a[n]) m = a[1]+a[2]+a[n];
}

int main()
{
    freopen("zhenhuan.in","r",stdin);
    freopen("zhenhuan.out","w",stdout);
    read(n);
    for(int i = 1; i <= n; i++) read(a[i]);
    if(n == 2) work();
    else work2();
    printf("%d",m);
    return 0;
}

本来应该280第三名的,但是T1定义后忘了ctrl+s于是…….
面壁思过ing

阅读更多
换一批

没有更多推荐了,返回首页