最有名的莫过于想死一次吗。

前言

至今都不知道题目是个啥。。。

T1 毛一琛

解题思路

\(\mathcal{Meet\;In\;The\;Middle}\)

其实就是一个爆搜。。。

把整个区间分为两部分,每个部分有两个集合。

对于每一个数状态只有三种:集合1,集合2,不选。

然后对于已经两个区间内,如果每个区间中的两个集合价值之差相同的话,

这四个集合所组合成的两个集合一定可以分成两个值相同的集合。

然后就是对于了两半分别 DFS 就好了。。

  • 注意:全部开 long long 或者 map套 vector会 TLE。

code

#include<bits/stdc++.h>
//#define int long long
using namespace std;
int n,ans,cnt,s[30];
bool vis[1<<21];
vector<int> v[1<<21];
unordered_map<int,int> mp;
void dfs(int opt,int x,int anc,int sum1,int sum2,int sta)
{
if(x==anc+1)
{
if(opt==1)
{
if(mp.find(abs(sum1-sum2))==mp.end()) return ;
int tmp=mp.find(abs(sum1-sum2))->second;
for(int i=0;i<v[tmp].size();i++)
vis[sta<<n/2|v[tmp][i]]=true;
}
else
{
if(mp.find(abs(sum1-sum2))==mp.end()) mp[abs(sum1-sum2)]=++cnt;
v[mp.find(abs(sum1-sum2))->second].push_back(sta);
}
return ;
}
dfs(opt,x+1,anc,sum1+((opt)?s[x+n/2]:s[x]),sum2,sta|(1<<x-1));
dfs(opt,x+1,anc,sum1,sum2+((opt)?s[x+n/2]:s[x]),sta|(1<<x-1));
dfs(opt,x+1,anc,sum1,sum2,sta);
}
signed main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&s[i]);
dfs(0,1,n/2,0,0,0);
dfs(1,1,n-n/2,0,0,0);
for(int i=1;i<(1<<n);i++) ans+=vis[i];
printf("%d",ans);
return 0;
}

T2 毛二琛

解题思路

非常好的一个题(至少对于我来说是这样的)

首先发现对于 swap 的顺序是有一定优先级的。。

然后我们循环求出每一个 swap 操作的优先级。

接下来 DP 定义 f[i][j] 为前 i 个 swap 操作中 第 i 个优先级排名为 j

就可以简单的写出 \(\mathcal{O(n^3)}\) 的 DP转移。

发现可以前缀和优化,然后就可以把复杂度降低到 \(\mathcal{O(n^2)}\)

可以通过此题。

  • 注意:操作优先级以及 DP 的边界问题。

code

70pts

#include<bits/stdc++.h>
#define int long long
#define f() cout<<"Pass"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
const int N=5e3+10,mod=1e9+7;
int n,ans,f[N][N],s[N],opt[N];
signed main()
{
n=read();
for(int i=1;i<=n;i++)
s[i]=read()+1;
for(int i=1;i<=n;i++)
{
if(s[i]-i>1)
{
if(!opt[i-2]) opt[i-2]=opt[i-3];
for(int j=i-1;j<=s[i]+1;j++)
opt[j]=opt[j-1]+1;
}
else
{
if(!opt[s[i]+1]) opt[s[i]+1]=opt[s[i]+2];
for(int j=i-2;j>=s[i];j--)
opt[j]=opt[j+1]+1;
}
}
f[1][1]=1;
for(int i=2;i<n;i++)
for(int j=1;j<i;j++)
{
if(opt[i]>opt[i-1])
for(int k=j+1;k<=i;k++)
f[i][k]=(f[i][k]+f[i-1][j])%mod;
if(opt[i]<opt[i-1])
for(int k=1;k<=j;k++)
f[i][k]=(f[i][k]+f[i-1][j])%mod;
if(opt[i]==opt[i-1])
for(int k=1;k<=i;k++)
f[i][k]=(f[i][k]+f[i-1][j])%mod;
}
for(int i=1;i<n;i++)
ans=(ans+f[n-1][i])%mod;
printf("%lld",ans);
return 0;
}

正解

#include<bits/stdc++.h>
#define int long long
#define f() cout<<"Pass"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
const int N=5e3+10,mod=1e9+7;
int n,ans,f[N][N],pre[N],s[N],opt[N];
signed main()
{
n=read();
for(int i=1;i<=n;i++)
s[i]=read()+1;
for(int i=1;i<=n;i++)
if(s[i]-i>1)
{
if(!opt[i-2]&&i-3>=0) opt[i-2]=opt[i-3];
for(int j=i-1;j<=s[i]+1;j++)
opt[j]=opt[j-1]+1;
}
else
{
if(!opt[i-1]&&i-2>=0) opt[i-1]=opt[i-2];
for(int j=i-2;j>=s[i];j--)
opt[j]=opt[j+1]+1;
}
f[1][1]=pre[1]=1;
for(int i=2;i<n;i++)
{
if(opt[i]>opt[i-1])
for(int k=2;k<=i;k++)
f[i][k]=(f[i][k]+pre[k-1])%mod;
if(opt[i]<=opt[i-1])
for(int k=1;k<i;k++)
f[i][k]=(f[i][k]+pre[i-1]-pre[k-1]+mod)%mod;
for(int j=1;j<=i;j++)
pre[j]=(pre[j-1]+f[i][j])%mod;
}
for(int i=1;i<=n-1;i++)
ans=(ans+f[n-1][i])%mod;
printf("%lld",ans);
return 0;
}

T3 毛三琛

解题思路

其实正解的时间复杂度是假的。

二分答案,查找每一个 x 下最小的最大值。

然后就是一些剪枝。。(不要开long long)

然后就没了。。(又水了一篇题解)(逃

code

#include<bits/stdc++.h>
#define ull unsigned long long
#define f() cout<<"Pass"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
const int N=1e4+10;
int n,m,ans=1e9,mod,sum,s[N],q[N];
bool check(int x)
{
int tot=1,res=0;
for(int i=1;i<=n;i++)
{
if(q[i]>x) return false;
if(res+q[i]<=x) res+=q[i];
else res=q[i],tot++;
if(tot>m) return false;
}
return tot<=m;
}
signed main()
{
n=read();
mod=read();
m=read();
for(int i=1;i<=n;i++)
s[i]=read();
for(int x=0;x<mod;x++)
{
sum=0;
for(int i=1;i<=n;i++)
{
q[i]=(x+s[i])%mod;
sum+=q[i];
}
if(!check(ans)) continue;
int l=0,r=sum+1,tmp=-1;
while(l<=r)
{
int mid=(l+r)>>1;
if(check(mid)){tmp=mid;r=mid-1;}
else l=mid+1;
}
if(tmp!=-1) ans=min(ans,tmp);
}
printf("%d",ans);
return 0;
}

8.4考试总结(NOIP模拟30)[毛一琛·毛二琛·毛三琛]的更多相关文章

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

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

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

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

  3. 6.17考试总结(NOIP模拟8)[星际旅行·砍树·超级树·求和]

    6.17考试总结(NOIP模拟8) 背景 考得不咋样,有一个非常遗憾的地方:最后一题少取膜了,\(100pts->40pts\),改了这么多年的错还是头一回看见以下的情景... T1星际旅行 前 ...

  4. 5.23考试总结(NOIP模拟2)

    5.23考试总结(NOIP模拟2) 洛谷题单 看第一题第一眼,不好打呀;看第一题样例又一眼,诶,我直接一手小阶乘走人 然后就急忙去干T2T3了 后来考完一看,只有\(T1\)骗到了\(15pts\)[ ...

  5. 5.22考试总结(NOIP模拟1)

    5.22考试总结(NOIP模拟1) 改题记录 T1 序列 题解 暴力思路很好想,分数也很好想\(QAQ\) (反正我只拿了5pts) 正解的话: 先用欧拉筛把1-n的素数筛出来 void get_Pr ...

  6. 2021.9.17考试总结[NOIP模拟55]

    有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...

  7. [考试总结]noip模拟23

    因为考试过多,所以学校的博客就暂时咕掉了,放到家里来写 不过话说,vscode的markdown编辑器还是真的很好用 先把 \(noip\) 模拟 \(23\) 的总结写了吧.. 俗话说:" ...

  8. noip模拟30

    \(\color{white}{\mathbb{缀以无尽之群星点点,饰以常青之巨木郁郁,可细斟木纹叶脉,独无可极苍穹之览,名之以:密林}}\) 看完题后感觉整套题都没什么思路,而且基本上整场考试确实是 ...

  9. Noip模拟30 2021.8.4

    T1 毛一琛 考场上打的稳定的$O((2^n)^2)$的暴力.其实再回忆一下上次那道用二进制枚举的题$y$ 就可以知道一样的道理,使用$\textit{Meet In the Middle}$, 按照 ...

  10. NOIP 模拟 $30\; \rm 毛三琛$

    题解 \(by\;zj\varphi\) 二分答案,考虑二分背包中的最大值是多少. 枚举 \(p\) 的值,在当前最优答案不优时,直接跳掉. 随机化一下 \(p\),这样复杂度会有保证. Code # ...

随机推荐

  1. mysql 必知必会整理—触发器[十五]

    前言 现在很多都是程序用于触发的,而不是触发器了. 正文 需要MySQL 5 对触发器的支持是在MySQL 5中增加的.因此,本章内容适用于MySQL 5或之后的版本. MySQL语句在需要时被执行, ...

  2. setTimeout(fn, 0) // it works - JavaScript 事件循环 动画演示

    在前端代码中很经常看到使用 setTimeout(fn, 0),如下面代码所示,乍一看很多余,但是移除了可能会出现一些奇奇怪怪的问题.要解释这个就需要理解 事件循环(Event Loop),下面会通过 ...

  3. 【Oracle】Oracle数据库,第N大数据取值

    Oracle数据库,第N大数据取值 没想到力扣还有数据库的练习,正好本菜鸡跑过来练手 要显示第二大的数据可以使用order by进行排序,然后用limit对显示的数据进行限制,limit1,1,以此来 ...

  4. IOT设备连接上云

    如何让我的设备连接上云?参考如下路径. 云 [![](http://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/assets/img/974556/1 ...

  5. 宜搭5月更新:跨应用数据读写能力升级,AI组件内测开放

    ​简介:表单.权限管理.AI组件等功能上新啦- 本次,我们带来了表单.权限管理.数据管理.平台管理权限.组件等功能的升级. 表单 支持跨应用数据查询 在使用组件数据联动.关联其他表单数据.关联表单组件 ...

  6. 媒体智能-淘宝直播流媒体互动实践 | D2 分享视频+文章

    背景:今天给大家带来的分享主题是<媒体智能-淘宝直播流媒体互动实践>,内容分为5个部分,首先看看在淘宝直播的直播间里主播可以怎样给用户拜年:然后具体讲如何制作一个手势拜年的特效:接着介绍我 ...

  7. 一不小心,它成为了 GitHub Alibaba Group 下 Star 最多的开源项目

    简介: 随着微服务的流行,应用更加轻量和高效,但是带来的困境是线上问题排查越来越复杂困难.传统的 Java 排查问题,需要重启应用再进行调试,但是重启应用之后现场会丢失,问题难以复现. 来源 | 阿里 ...

  8. Serverless Kubernetes 落地实践

    ​简介:如何通过原生 Kubernetes 提供 Serverless 能力?如何借力丰富的云原生社区生态?本文将给大家介绍一下我们在 Serverless Kubernetes 上的落地实践. 作者 ...

  9. 学术顶会再突破!计算平台MaxCompute论文入选国际顶会VLDB 2021

    ​ 简介: VLDB 2021上,阿里云计算平台MaxCompute参与的论文入选,核心分布式调度执行引擎Fangorn.基于TVR Cost模型的通用增量计算优化器框架Tempura等分别被Indu ...

  10. Prometheus+Grafana+alertmanager构建企业级监控系统(一)

    一.环境准备 k8s集群角色 IP 主机名 配置 控制节点 192.168.199.131 master centos7.9 4核6G 工作节点 192.168.199.128 monitor cen ...