一道比较套路的题,看到数据范围就差不多有想法了吧。

题目大意:给一个数列和\(m\),在数列任选若干个数,使得他们的和对\(m\)取模后最大

取膜最大,好像不能DP/贪心/玄学乱搞啊。\(n\le35\)?果断meet in middle

考虑我们已经搜出了序列前一半的解,那么怎么根据后面的结果合并出结果?

设我们现在得到的和为\(x\)(对\(m\)取膜后),我们令一个数\(y=m-x\),然后在前面的解中查找\(y\)的前驱即可

接下来进行简单的证明:

  • 若可以找到前驱\(z\),由于\(z<y\),故\(x+z<m\)。又因为\(z=max(s\in[1,y-1])\),故此时值最大。
  • 若无法找到前驱\(z\),此时我们取任何一个值\(s\)都会导致\(x+s>x+y=m\),此时\((x+s)\ mod\ m<x\)(这个很好理解吧)

于是我们每次都二分找出前缀,并取\(max\)即可。

CODE

  1. #include<cstdio>
  2. #include<cctype>
  3. #include<algorithm>
  4. using namespace std;
  5. const int N=40;
  6. int a[N],n,m,sum[1<<20],cnt,ans;
  7. inline char tc(void)
  8. {
  9. static char fl[100000],*A=fl,*B=fl;
  10. return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
  11. }
  12. inline void read(int &x)
  13. {
  14. x=0; char ch; while (!isdigit(ch=tc()));
  15. while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
  16. }
  17. inline int find(int x)
  18. {
  19. int l=1,r=cnt,res;
  20. while (l<=r)
  21. {
  22. int mid=l+r>>1;
  23. if (sum[mid]<x) res=sum[mid],l=mid+1; else r=mid-1;
  24. }
  25. return res;
  26. }
  27. inline void init(int now,int tot)
  28. {
  29. if (now>(n>>1)) { sum[++cnt]=tot; return; }
  30. init(now+1,(tot+a[now])%m); init(now+1,tot);
  31. }
  32. inline void DFS(int now,int tot)
  33. {
  34. if (now>n) { ans=max(ans,tot+find(m-tot)); return; }
  35. DFS(now+1,(tot+a[now])%m); DFS(now+1,tot);
  36. }
  37. int main()
  38. {
  39. //freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
  40. register int i; read(n); read(m);
  41. for (i=1;i<=n;++i) read(a[i]);
  42. init(1,0); sort(sum+1,sum+cnt+1); DFS((n>>1)+1,0);
  43. return printf("%d",ans),0;
  44. }

CF 888E Maximum Subsequence的更多相关文章

  1. CF 888E Maximum Subsequence——折半搜索

    题目:http://codeforces.com/contest/888/problem/E 一看就是折半搜索?……然后排序双指针. 两个<m的数加起来如果>=m,一定不会更新答案.因为- ...

  2. Codeforces 888E - Maximum Subsequence(折半枚举(meet-in-the-middle))

    888E - Maximum Subsequence 思路:折半枚举. 代码: #include<bits/stdc++.h> using namespace std; #define l ...

  3. Codeforces 888E Maximum Subsequence

    原题传送门 E. Maximum Subsequence time limit per test 1 second memory limit per test 256 megabytes input ...

  4. 888E - Maximum Subsequence 中途相遇法

    Code: #include<cstdio> #include<algorithm> #include<cstring> #include<string> ...

  5. 【CF888E】Maximum Subsequence(meet in the middle)

    [CF888E]Maximum Subsequence(meet in the middle) 题面 CF 洛谷 题解 把所有数分一下,然后\(meet\ in\ the\ middle\)做就好了. ...

  6. 1007. Maximum Subsequence Sum (25)

    Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to be { Ni, ...

  7. PAT - 测试 01-复杂度2 Maximum Subsequence Sum (25分)

    1​​, N2N_2N​2​​, ..., NKN_KN​K​​ }. A continuous subsequence is defined to be { NiN_iN​i​​, Ni+1N_{i ...

  8. Maximum Subsequence Sum(接上篇)

    Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to be { Ni, ...

  9. PAT 解题报告 1007. Maximum Subsequence Sum (25)

    Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to be { Ni, ...

随机推荐

  1. javasscript基础

    一.使用JS完成注册表单数据校验 1.需求分析 用户在进行注册的时候会输入一些内容,但是有些用户会输入一些不合法的内容,这样会导致服务器的压力过大,此时我们需要对用户输入的内容进行一个校验(前端校验和 ...

  2. CSS| 框模型-輪廓

    轮廓(outline)是绘制于元素周围的一条线,位于边框边缘的外围,可起到突出元素的作用.CSS outline 属性规定元素轮廓的样式.颜色和宽度. 相關屬性 outline-color 属性 ou ...

  3. 解决SQL Server本地Windows身份无法登录

    CREATE LOGIN [计算机名\Windows帐户名] FROM WINDOWS

  4. centos 6.5下安装nmap工具及简单用法

    Nmap是一款针对大型网络的端口扫描工具,被广泛应用于黑客领域做漏洞探测以及安全扫描,其主要功能有主机发现(Host Discovery). 端口扫描(Port Scanning). 版本侦测(Ver ...

  5. myeclipse编写servlet

    1.File--New--Other.搜索web--Dynamic Web Project--Next,Project name--Next,Next--web应用的根目录和web资源存放的目录--- ...

  6. Java中常用的字节流和字符流

    IO流(输入流.输出流) 字节流.字符流 1.字节流: InputStream.OutputStream InputStream抽象了应用程序读取数据的方式: OutputStream抽象了应用程序写 ...

  7. win10系统如何关掉系统自动更新

    越来越多的电脑使用者都在使用Windows10系统,尽管系统是一代代更新的,但难免有槽点,Windows10系统也不例外,最大的槽点就是“自动更新”的功能.当然,“自动更新”的功能也是相当有用处的.  ...

  8. redis慢查询日志的配置和查看

    Redis是单线程运行的,一个慢执行,会让后续的大量执行延时,吞吐量也会极大的降低.记录.查询.监控Redis慢执行意义重大.Redis的slowlog只记录在内存中,效率很高,不用过于担心影响性能. ...

  9. Alpha冲刺! Day5 - 砍柴

    Alpha冲刺! Day5 - 砍柴 今日已完成 晨瑶:review了业务逻辑表格,确定了工具类具体函数有哪些:讨论确定了记录的存储方式为HTML. 昭锡:继续学习Gson,并写出json基本操作的D ...

  10. django知识点回顾(上)

    Django---知识点: 1. 配置文件: media: avatar = models.FileField(upload_to='avatar')#数据库里的model MEDIA_ROOT=os ...