zoukankan      html  css  js  c++  java
  • P4409 [ZJOI2006]皇帝的烦恼(20190922B)(乱搞)

    考场历程十分艰辛啊。。。

    • 第一题没切掉,还浪费了很长时间,就是一个裸的最小生成树,但是因为可恶的distance为关键字莫名其妙查错了10min....
    • 本题先乱搞了一下,过了样例
    • 然后看第三题,可写性极差
    • 回头写此题,写了一个自己看起来是正解的二分(正解就是二分)
    • 然后干了两小时第三题
    • 第三题毛线分都没有(据说是线段树合并)

    旁边的dalao没有干第三题,人家写了俩小时正解...

    以后我要是再干那种题我就把bk201头拧掉掉....

    (以上为闲扯)

    ~~~~~~~~~~~~我是分割线~~~~~~~~~

    化简题意:给一个圈,圈上的点分配ai个数,相邻点的数字不能有相同的,求最小的数字种数

    solution:

    首先,乱搞可以搞出来:两两之和的最大值就是答案....然后后来过了样例....

    为什么呢?

    感性证明一波:两个将军之间一定是不能有相同牌子的,也就是说,两个将军之间的牌子数量和就是两个将军需要的牌子和,而隔一个就可以和前一个有重复。

    然后呢?会有这样的情况

    3
    1 1 1

    很神奇,一个奇数环,应该是3,但是乱搞的是2....

    但是,秉承着绝不写正解的宗旨,我回到家继续了乱搞....

    于是一篇题解看得我五体投地...

    这是对于答案的另一种算法:对于每一种牌子,可以把它看成分给n/2个将军,当这些牌子利用最好时,就是最优解。如果是偶数,那当每个牌子n/2时,就是上述情况。问题就在这个奇环上。

    同上,对于每一个牌子,分给这些将军,那么总数就是

    Σa[i]       /(n/2)

    (向上取整)

    所以,当环是奇数,判断得到的两个答案的最大值,就是真答案了。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=20005;
    int n;
    int a[maxn];
    int ans;
    int sum;
    
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            sum+=a[i];
        }
        if(n==1)
        {
            printf("%d",n);
            return 0;
        }
        ans=a[1]+a[n];
        for(int i=1;i<n;i++)
        {
            if(a[i]+a[i+1]>ans)
            ans=a[i]+a[i+1];
        }
        double summ=sum,nn=n,tem;
        tem=ceil(summ/(n/2));
        if((int)tem>ans)
        ans=(int)tem;
        printf("%d",ans);
        return 0;
    }

    正解见下(完)

  • 相关阅读:
    SBT树
    WGS84、Web墨卡托、火星坐标、百度坐标互转
    Chord算法
    马尔科夫及隐含马尔科夫模型
    VirtualBox的四种网络连接方式
    匈牙利算法求解任务分配问题
    回溯与分支定界
    【Docker】docker安装mysql
    【RocketMQ】同一个项目中,同一个topic,可以存在多个消费者么?
    【Feign调用异常】org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported
  • 原文地址:https://www.cnblogs.com/ajmddzp/p/11570150.html
Copyright © 2011-2022 走看看