T1 毛一琛

考场上打的稳定的$O((2^n)^2)$的暴力。其实再回忆一下上次那道用二进制枚举的题$y$

就可以知道一样的道理,使用$\textit{Meet In the Middle}$,

按照暴力枚举的思想(就是枚举两个没有交集的子集判断其和是不是相等)

去考虑将整个集合分为两部分,在每一部分分别找任意两个集合能够凑出的和

为了好操作我们找到$1~n/2$的集合中任意两个子集的和,并将其标记,存入$map$

并使用$vector$对应$sta$及其标记,再在$n/2+1~n$的枚举中

两两配对就行,配对条件有下:

一, 两个集合没有交集

二,两个集合的并集不空

三,两个集合的并集未被标记。

然后就完了

  1. 1 #include<bits/stdc++.h>
  2. 2 using namespace std;
  3. 3 int n,m[22],ans,tot;
  4. 4 map<int,int>vis;
  5. 5 vector<int>S[1100000];
  6. 6 bool vv[1100000];
  7. 7 inline void dfs(int x,int sta,int l,int r){
  8. 8 if(x>n/2){
  9. 9 if(!vis[l-r]) vis[l-r]=++tot;
  10. 10 int now=vis[l-r]; S[now].push_back(sta);
  11. 11 return;
  12. 12 }
  13. 13 dfs(x+1,sta,l,r);
  14. 14 dfs(x+1,sta|(1<<x-1),l+m[x],r);
  15. 15 dfs(x+1,sta|(1<<x-1),l,r+m[x]);
  16. 16 }
  17. 17 inline void sfd(int x,int sta,int l,int r){
  18. 18 if(x>n){
  19. 19 if(vis.find(r-l)==vis.end()) return;
  20. 20 int now=vis[r-l];
  21. 21 for(int i=0;i<S[now].size();i++){
  22. 22 if(sta&S[now][i]) continue;
  23. 23 if(!(sta|S[now][i])) continue;
  24. 24 if(vv[sta|S[now][i]]) continue;
  25. 25 vv[sta|S[now][i]]=1; ++ans;
  26. 26 }
  27. 27 return;
  28. 28 }
  29. 29 sfd(x+1,sta,l,r);
  30. 30 sfd(x+1,sta|(1<<x-1),l+m[x],r);
  31. 31 sfd(x+1,sta|(1<<x-1),l,r+m[x]);
  32. 32 }
  33. 33 namespace WSN{
  34. 34 inline short main(){
  35. 35 scanf("%d",&n);
  36. 36 for(int i=1;i<=n;i++) scanf("%d",&m[i]);
  37. 37 dfs(1,0,0,0); sfd(n/2+1,0,0,0);
  38. 38 printf("%d\n",ans);
  39. 39 return 0;
  40. 40 }
  41. 41 }
  42. 42 signed main(){return WSN::main();}

T2 毛二琛

考场上努力思考正解,可是忒弱想不到,

无奈之下甩出一手$\textit{Next Permutation}$(还是按照当时终端给出的编译信息自学的,乐死)

当时还想着可能是数学,不过是我想多了

关于如何从升序排列的连续数字变为给定数列,只需考虑每个位置不同的元素应向左/右移动

然后还有先后次序,且牵连改变,这样

我们记录$pos_i$表示$i$元素在给定序列里的位置,这样就可以知道升序数列中的那个$i$元素如何移动

我们给他打上标记,同时,为了让他移动的数字打上相反标记表示作出牺牲让$i$移动,这些元素是一段区间

$i~pos_i$(当$i<pos_i$时,另一种相反)

这样预处理完之后,就可以进行$dp$,$dp_{i,j}$表示给定序列前$i$个位置,第$i$号元素排名为$j$的方案

我们发现,当$i$元素应向右移动时,他的转移是他后面的$dp_{i-1,j}$的加和

反之是前面的$dp_{i-1,j}$的加和,这样单纯转移是$O(n^3)$的

处理出一个前缀和数组记录前缀即可优化到$O(n^2)$,可过

  1. 1 #include<bits/stdc++.h>
  2. 2 #define zuo (1)
  3. 3 #define you (2)
  4. 4 using namespace std;
  5. 5 const int NN=5005,mod=1e9+7;
  6. 6 int n,a[NN],pos[NN],tot,ans,biao[NN],dp[NN][NN],sum[NN][NN];
  7. 7 namespace WSN{
  8. 8 inline short main(){
  9. 9 scanf("%d",&n);
  10. 10 for(int i=1;i<=n;i++) scanf("%d",&a[i]),++a[i],pos[a[i]]=i;
  11. 11 for(int i=1;i<=n;i++){
  12. 12 if(pos[i]==i){puts("0");return 0;}
  13. 13 if(pos[i]<i){biao[i]=zuo;for(int j=pos[i]+1;j<i;j++) biao[j]=you;}
  14. 14 if(pos[i]>i){biao[i]=you;for(int j=i+1;j<pos[i];j++) biao[j]=zuo;}
  15. 15 }
  16. 16 dp[1][1]=sum[1][1]=1;
  17. 17 for(int i=2;i<=n;i++)
  18. 18 for(int j=1;j<=i;j++){
  19. 19 if(biao[i]==you) dp[i][j]=(sum[i-1][i-1]-sum[i-1][j-1]+mod)%mod;
  20. 20 if(biao[i]==zuo) dp[i][j]=sum[i-1][j-1];
  21. 21 sum[i][j]=(sum[i][j-1]+dp[i][j])%mod;
  22. 22 }
  23. 23 printf("%d\n",sum[n-1][n-1]);
  24. 24 return 0;
  25. 25 }
  26. 26 }
  27. 27 signed main(){return WSN::main();}

T3 毛三琛

复杂度玄学。。。。。。

就是暴力枚举$x$,然后生成新的物品质量,然后二分$check$

然而我们发现,只是这样肯定是过不了的。。。。。

它稳稳的T掉了。。。。

我们需要一步剪枝,他就可以

就是在每次进行真正的二分前对生成的序列进行目前的最优答案$check$,如果目前最优的答案判断不成功,直接跳过就好

正确性显然

  1. 1 #include<bits/stdc++.h>
  2. 2 using namespace std;
  3. 3 int n,mod,k,a[10005],wsn=0x7fffffff,b[10005],l,r,ans;
  4. 4 inline bool check(int mid,int x){
  5. 5 int tmp=0,num=1;
  6. 6 for(register int i=1;i<=n&&num<=k;++i){
  7. 7 int shu=(a[i]+x)%mod; if(shu>mid) return 0;
  8. 8 tmp+shu>mid ? (++num,tmp=shu):(tmp+=shu);
  9. 9 } return num<=k;
  10. 10 }
  11. 11 namespace WSN{
  12. 12 inline short main(){
  13. 13 scanf("%d%d%d",&n,&mod,&k);
  14. 14 for(register int i=1;i<=n;++i) scanf("%d",&a[i]);
  15. 15 for(register int x=0;x<mod;++x){
  16. 16 if(!check(wsn,x)) continue;
  17. 17 l=0,r=wsn; while(l<=r){
  18. 18 int mid=l+r>>1;check(mid,x)? (r=mid-1,ans=mid):(l=mid+1);
  19. 19 }wsn=min(wsn,ans);
  20. 20 }printf("%d\n",wsn);
  21. 21 return 0;
  22. 22 }
  23. 23 }
  24. 24 signed main(){return WSN::main();}

 最后,附上今天更新的电脑屏幕的壁纸,比较帅。。。。。。

$\textit{Dark Lao: MYC  Orz Orz}$

$\textit{Dark Lao: MYC  Orz Orz}$

$\textit{Dark Lao: MYC  Orz Orz}$

Noip模拟30 2021.8.4的更多相关文章

  1. noip模拟30[毛毛毛探探探]

    \(noip模拟30\;solutions\) 所以说,这次被初中的大神给爆了????? 其实真的不甘心,这次考场上的遗憾太多,浪费的时间过多,心情非常不好 用这篇题解来结束这场让人伤心的考试吧 \( ...

  2. 2021.8.4考试总结[NOIP模拟30]

    T1 毛衣衬 将合法子集分为两个和相等的集合. 暴力枚举每个元素是否被选,放在哪种集合,复杂度$O(3^n)$.考虑$\textit{meet in the middle}$. 将全集等分分为两部分分 ...

  3. Noip模拟70 2021.10.6

    T1 暴雨 放在第一道的神仙题,不同的做法,吊人有的都在用线段树维护$set$预处理 我是直接$dp$的,可能代码的复杂度比那种的稍微小一点 设$f[i][j][p][0/1]$表示考虑了前$i$列, ...

  4. Noip模拟76 2021.10.14

    T1 洛希极限 上来一道大数据结构或者单调队列优化$dp$ 真就没分析出来正解复杂度 正解复杂度$O(q+nm)$,但是据说我的复杂度是假的 考虑一个点转移最优情况是从它上面的一个反$L$形转移过来 ...

  5. Noip模拟69 2021.10.5

    考场拼命$yy$高精度结果没学好$for$循环痛失$50pts$,当场枯死 以后一定打对拍,要不考后会... T1 石子游戏 首先要知道典型的$NIM$博弈,就是说如果所有堆石子个数的异或和为$0$则 ...

  6. Noip模拟63 2021.9.27(考场惊现无限之环)

    T1 电压机制 把题目转化为找那些边只被奇数环包含. 这样的话直接$dfs$生成一棵树,给每个点附上一个深度,根据其他的非树边都是返祖边 可以算出环内边的数量$dep[x]-dep[y]+1$,然后判 ...

  7. Noip模拟61 2021.9.25

    T1 交通 考场上想了一个$NPC$.应该吧,是要求出图里面的所有可行的不重复欧拉路 无数种做法都无法解出,时间也都耗在这个上面的,于是就考的挺惨的 以后要是觉得当前思路不可做,就试着换一换思路,千万 ...

  8. Noip模拟59 2021.9.22

    新机房首模拟变倒数 T1 柱状图 关于每一个点可以做出两条斜率分别为$1,-1$的直线, 然后题意转化为移动最少的步数使得所有点都在某一个点的两条直线上 二分出直线的高度,判断条件是尽量让这条直线上部 ...

  9. Noip模拟52 2021.9.13

    T1 异或 比较稳的切掉 观察数据范围,无法线性筛啥的,根号复杂度也会死,于是只能考虑$log$级 然后打表 发现当$n$为$2^i$时的答案是一个可递归数列: $1,3,7,15,31,63,127 ...

随机推荐

  1. CSS导航菜单(二级菜单)

    index.html <div class="nav"> <ul> <li> <a href="#">Java& ...

  2. js 显示日期时间,时间过一秒加1

    html: <div id="data"><font>2017年10月17日 15:11:11</font></span> js: ...

  3. 使用 mysql 的 Docker 镜像

    使用 mysql 的 Docker 镜像 前言 之前搞了很多都是手工在操作系统的镜像中安装使用 mysql,作为自己折腾也就算了,作为实际使用实为不妥:Docker最重要的特性就是可扩展性,把各种程序 ...

  4. 洛谷P1019——单词接龙(DFS暴力搜索)

    https://www.luogu.org/problem/show?pid=1019#sub 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母, ...

  5. Docker系列(1) - Centos8.X安装Docker

    环境准备 需要会Linux的基础 Centos8.x 使用Xshell连接远程服务器 环境查看 #系统内核是4.18以上 [root@localhost ~]# uname -r 4.18.0-305 ...

  6. OC源码剖析对象的本质

    1. 类的底层实现 先写一个 Person 类: @interface Person : NSObject @property (nonatomic, copy) NSString *p_name; ...

  7. jmeter之聚合报告(Aggregate Report)

    jmeter最常用的listener--聚合报告Aggregate Report,每一个字段的具体含义是什么? Label:每个请求的名称.每个 JMeter 的 element(例如 HTTP Re ...

  8. vue 主次页面区分

    1.路由设定,增加meta参数 { path: '/', name: 'Home', component: Home, meta: { index: 0, showFooter: true //由这个 ...

  9. pyqt5无边框拖动

    from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * import sys class ...

  10. CF39C-Moon Craters【dp】

    正题 题目链接:https://www.luogu.com.cn/problem/CF39C 题目大意 坐标轴上有\(n\)个圆,给出每个圆的位置\(c_i\)和半径\(r_i\). 要求选出最多的圆 ...