「题解」:毛三琛

问题 C: 毛三琛subset

时间限制: 1 Sec  内存限制: 512 MB

题面



题面谢绝公开。

题解



一眼题解随机化,吓够呛。一句话题解:二分答案加剪枝。

外层枚举$x$,然后二分答案暴力$check$。如果当前答案对于x的check失败就continue,

因为在当前的x中不可能找到比当前答案更优秀的解。加clock卡常可以A。

貌似不需要看脸。毕竟我这个非洲人都一遍A了。复杂度$O(np+nlognlogp)$。

代码:(ps.$¥$神指出了我代码的缺陷:其实在外面直接赋值可以少一个$log$,没必要传参进$check$再赋值。)

#include<bits/stdc++.h>
#define rint register int
using namespace std;
int n,p,k,a[10004],sum,ans=0x7fffffff,x[10004],cl;
inline bool check(int z,int mid)
{
    int Sum=0,Cnt=1;
    for(rint i=1;i<=n;++i)
    {
        int lin=a[i]+z;
        if(lin>=p)lin-=p;
        if(lin>mid)return false;
        if(Sum+lin>mid)
        {
            Sum=0,Cnt++;
            if(Cnt>k)return false;
        }
        Sum+=lin;
    }
    return true;
}
int main()
{
    srand(time(NULL));
    int cl=clock();
    scanf("%d %d %d",&n,&p,&k);
    for(rint i=1;i<=n;++i)scanf("%d",&a[i]),sum+=a[i];
    for(rint i=0;i<p;++i)x[i]=i;
    random_shuffle(x,x+p);
    for(rint i=0;i<p;++i)
    {
        if(!check(x[i],ans))continue;
        int l=0,r=sum+1;
        while(l<r)
        {
            int mid=(l+r)>>1;
            if(!check(x[i],mid))l=mid+1;
            else r=mid;
        }
        ans=min(ans,l);
        if(clock()-cl>970000)break;
    }
    printf("%d\n",ans);
}

原文地址:https://www.cnblogs.com/xingmi-weiyouni/p/11667346.html

时间: 2024-09-28 15:01:20

「题解」:毛三琛的相关文章

「10.13」毛一琛(meet in the middle)&#183;毛二琛(DP)&#183;毛三琛(二分+随机化???)

A. 毛一琛 考虑到直接枚举的话时间复杂度很高,我们运用$meet\ in\ the\ middle$的思想 一般这种思想看似主要用在搜索这类算法中 发现直接枚举时间复杂度过高考虑枚举一半另一半通过其他算法统计,保证两边互不影响 今天的题我们考虑枚举先枚举左半部分,然后每个物品有三种取值情况 选入A集合,选入B集合,不选,系数不同 考虑完左半部分再去考虑右半部分,那么我们可以用哈系表先从将左半部分的答案统计出来 然后右半部分查询他的相反数注意去重 也可以用将两边状态都用结构体存下来 注意去重 思

「题解」kuangbin 最小生成树

POJ-1251 Jungle Roads (水题,%c) POJ-1287 Networking (水) POJ-2031 Building a Space Station (%f浮点数尴尬精度,两球间距离) POJ-2421 Constructing Roads (一些边已建好,简单处理一下) ZOJ-1586 QS Network (处理一下边权) HDU-1233 还是畅通工程 (水) HDU-1875 畅通工程再续 (浮点数,条件连边) HDU-1301 Jungle Roads (重

「题解」「美团 CodeM 资格赛」跳格子

目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞定,最后无奈 \(90pts\) . 然而 \(T2\) 想到很多很奇怪的做法,结果正解在 \(28min\) 之内做出... 结果 \(T3\) 是本人最不擅长的伪期望,直接跳过,啥都没得. 来水一发 \(T1\) 的题解... 题目描述 点这里 考场思路 其实并没有什么十分特别的思路,就是一通乱

「题解」:毛一琛/$cow$ $subsets$

问题 A: 毛一琛/$cow$ $subsets$ 时间限制: 1 Sec  内存限制: 512 MB 题面 题面谢绝公开. 题解 题名貌似是个大神??看起来像是签到题然后就死了. 首先$O(3^n)$算法显然.也显然过不去$20$的测试点. 正解是赫赫有名的$meet$ $in$ $the$ $middle$算法.数据在40以内的都能用$meet$ $in$ $the$ $middle$?? 对于两半路径,可以拼起来并且构成合法答案的条件是两人获得的分数相同. 所以一个比较聪明的办法是,不去记

「题解」:[loj2763][JOI2013]现代豪宅

问题 A: 现代豪宅 时间限制: 1 Sec  内存限制: 256 MB 题面 题目描述 (题目译自 $JOI 2013 Final T3$「現代的な屋敷」) 你在某个很大的豪宅里迷路了.这个豪宅由东西方向$M$列,南北方向$N$行的正方形房间组成. 从西面开始第$x$列,从南面开始第y行的房间用$(x,y)$表示. 相邻的两个房间之间都有一扇门.对于每扇门,门关上表示不可通行,门打开表示可以通行. 当门打开时,从门一边的房间走到另一边的房间需要$1$分钟. 另外,一些房间中有一个开关,如果连续

「题解」:世界线

问题 A: 世界线 时间限制: 1 Sec  内存限制: 256 MB 题面 题面谢绝公开. 题解 我刚学完bitset就考了???然而我赛时并没有想到是bitset…… 话说我bitset还是没有颓完啊赶紧去补一波时空复杂度…… bitset优化暴力(据某诺神说这是bitset果题??) 注意dfs的时侯如果目标节点已经搜过了直接用当前节点的bitset或上目标节点的bitset值即可. 还有$6e4×6e4$会炸空间.开一个$6e4×3e2$的然后一半一半跑即可. 至于怎么跑一半,直接判断和

「题解」:联

问题 A: 联 时间限制: 2 Sec  内存限制: 256 MB 题面 题面谢绝公开. 题解 解法1:离散化+线段树. 1e18的数据范围直接离散化掉所有的l和r,加一个映射数组表示间距即可. 线段树维护区间和,扫0的时候判定子树和等不等于子树大小. 维护两个标记:lazy(将一个区间赋值成什么).xr(是否异或整个区间)跑就完了. (我会说我沉迷解法二而解法一是水的么 感谢Larry提供的优质讲解及代码) #include<bits/stdc++.h> #define int long l

「题解」:X国的军队

问题 A: X国的军队 时间限制: 1 Sec  内存限制: 256 MB 题面 题面谢绝公开. 题解 简单贪心. 按照存活的士兵数量(即参加战斗的士兵数量减去阵亡的士兵数量)排序. 若存活士兵数量相同则按照参与战斗的士兵数量排序. 顺序扫一遍统计答案. #include<bits/stdc++.h> #define int long long #define rint register int #define read(A) A=init() using namespace std; inl

「题解」:Simple

问题 A: Simple 时间限制: 1 Sec  内存限制: 256 MB 题面 题面谢绝公开. 题解 不算数学的数学题?? 直接枚举会重.$60%$两种算法:1.无脑$vis$数组记录.2.$exgcd$解方程判定是否有解. $100%$:首先考虑特殊情况:$n$.$m$互质. 我们设$n*x+m*y=z$,考虑枚举$y$和$x$,不难发现,当$y>=x$的时候均能找到一个$y'$使得$n|(y-y')$. 于是会出现重复.因此只需枚举$y([0,n-1])$,计算贡献即可. 对于一般情况,