[20180826]四校联考
T1谜题(nazo)
Problem Here
Solution
- 先把所有点的开关状态压成一个二进制数
- 按一个按钮就相当于异或上一个二进制数
- 显然不会按同一个按钮两次
- 枚举\(\left\lfloor\frac{n}{2}\right\rfloor\)个按钮每个按不按,计算只按前\(\left\lfloor\frac{n}{2}\right\rfloor\)个按钮得到每种状态的最少次数保存在map里
- 接着枚举后$ \left\lceil \frac{n}{2} \right \rceil $个按钮每个按不按,根据按的按钮的异或和到map里找到对应状态并更新答案
用hash表优化map,时间复杂度可优化到\(O( 2^{\frac{n}{2}})\)。
#include<bits/stdc++.h>
using namespace std;
inline long long read(){long long x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;
}
#define MN 45
#define M 6233333
int n,m,ans=40;
long long t,res,opt[MN];
struct Map{struct edge{int nex,w;long long val;}e[M];int hr[M],cnt;inline int&operator[](long long x){register int i;for(i=hr[x%M];i;i=e[i].nex)if(e[i].val==x) return e[i].w;e[++cnt]=(edge){hr[x%M],0,x};hr[x%M]=cnt;return e[cnt].w;}
}mp;
int main(){
// freopen("nazo.in","r",stdin);
// freopen("nazo.out","w",stdout);n=read();m=read();register int i,j,x,y,step;for(i=0;i<n;i++) res^=((read()==0)*1ll)<<i,opt[i]|=1ll<<i;for(i=1;i<=m;i++) x=read()-1,y=read()-1,opt[x]|=1ll<<y,opt[y]|=1ll<<x;for(i=0;i<1<<n/2;i++){for(t=res,j=step=0;j<n/2;j++) if((i>>j)&1) t^=opt[j],step++;mp[t]=std::min(mp[t]?mp[t]:MN,step+1); }for(i=0;i<1<<n-n/2;i++){for(t=j=step=0;j<n-n/2;j++) if((i>>j)&1) t^=opt[n-j-1],step++;mp[t]?ans=std::min(ans,mp[t]+step-1):0; }return 0*printf("%d",ans);
}
T2染色(iro)
Problem Here
Solution
假设最后用了\(m\)种颜色,我们把这些颜色编号为\(1\)~\(m\)。
\(m\)显然存在一个下界,即每两个相邻节点的颜色数之和的最大值。
- 当\(n\)为偶数时,答案就是这个最大值。
如果您直接输出它,您会获得40分 - 当n为奇数时,假设1号点的颜色为\(1\)~\(a_i\),那么我要使偶数点所取得颜色尽可能小,奇数点所取得颜色尽可能大,显然可以通过贪心来完成。
所以,二分答案加+贪心check,时间复杂度\(O(n\log n)\)
#include<bits/stdc++.h>
using namespace std;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;
}
#define MN 100005
#define mid (l+r>>1)
int n,a[MN],MIN;
inline bool check(int md){int x=a[2];for(int i=3;i<=n;i++){if(i&1){x=std::max(0,a[i]-md+a[1]+x);}else{x=std::max(0,a[i]-a[1]+x);}if(x==0) return 1;}return 0;
}
int main(){n=read();register int i;for(i=1;i<=n;i++) a[i]=read(),MIN=std::max(MIN,a[i]+a[i-1]);MIN=std::max(MIN,a[1]+a[n]);if(~n&1) return 0*printf("%d\n",MIN);int l=MIN,r=MIN<<1,ans;while(l<=r){if(check(mid)) ans=mid,r=mid-1;else l=mid+1;}printf("%d\n",ans);return 0;
}
T201串(kushi)
Problem Here
Solution
首先有一个很好想得n方dp。——70分
注意到我们只关心后缀,所以可以用后缀来表示状态
\(dp_{i,j}\)表示前i个01串,其中一个子序列的末尾存在一个后缀等于j的最小答案。
\(dp_{i,j}\to dp_{i+1,j}\)有两种转移:
只要加上\(g(a_i,a_{i+1})\),可以直接加上这个值,若不执行该转移,将该值减去
枚举\(a_{i+1}\)的一个前缀p,求出\(min\{dp_{i,p}\}\),再枚举\(a_i\)的后缀\(u\),用\(min\{dp_{i,p}\}\)来更新\(dp_{i+1,u}\)
复杂度是\(O(nm)\).
//70分dp
#include<bits/stdc++.h>
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;
}
inline int read01(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+ch-'0';ch=getchar();}return x*f;
}
#define MN 1005
int ans,n,m,a[MN];
int cr[MN][MN],f[MN][MN];
inline void rw(int &i,int j){if(i<j) i=j;
}
int main(){freopen("kushi.in","r",stdin);freopen("kushi.out","w",stdout);n=read(),m=read();register int k,i,j;if(n>1000) return 0*puts("orz");for(i=1;i<=n;i++) a[i]=read01();for(i=1;i<=n;i++)for(j=i+1;j<=n;j++)for(k=m;k>=0;k--)if((a[j]>>(m-k))==(a[i]%(1<<k))){cr[i][j]=k;break;}for(i=0;i<=n;i++)for(j=0;j<=n;j++)if(i!=j){if(i<j) rw(f[i][j+1],f[i][j]+cr[j][j+1]),rw(f[j+1][j],f[i][j]+cr[i][j+1]);else rw(f[i+1][j],f[i][j]+cr[i][i+1]),rw(f[i][i+1],f[i][j]+cr[j][i+1]);}ans=0;for(i=0;i<n;i++) rw(ans,f[i][n]),rw(ans,f[n][i]);printf("%d\n",m*n-ans);return 0;
}
#include<bits/stdc++.h>
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;
}
#define MN 200005
#define inf (1e9)
char s[25];
int a[MN],f[25][1<<20],cr,res;
int main(){
// freopen("kushi.in","r",stdin);
// freopen("kushi.out","w",stdout);int n,m,i,j,k;n=read();m=read();for(i=1;i<=n;i++){scanf("%s",s+1);for(j=1;j<=m;j++) a[i]+=(s[j]=='0')<<j-1;}memset(f,67,sizeof f);f[0][0]=m;for(i=2;i<=n;i++){for(k=0;k<m;k++)if((a[i-1]>>k)==(a[i]&((1<<m-k)-1))) break;cr+=k;res=inf;for(j=0;j<=m;j++) res=std::min(res,f[m-j][a[i]&((1<<m-j)-1)]+j-k);for(j=0;j<=m;j++) f[m-j][a[i-1]>>j]=std::min(f[m-j][a[i-1]>>j],res);}res=inf;for(i=0;i<=m;i++)for(j=0;j<1<<i;j++) res=std::min(res,f[i][j]);printf("%d",res+cr);
}
Blog来自PaperCloud,未经允许,请勿转载,TKS!
转载于:https://www.cnblogs.com/PaperCloud/p/9538423.html
[20180826]四校联考相关推荐
- NOIP模拟赛 四校联考 递推 + 分类讨论 + 树上期望
NOIP 模拟题 题目名称兔子被子蚊子 源程序文件名rabbit.cpp quilt.cpp mosquito.cpp 输入文件名rabbit.in quilt.in mosquito.in 输出文件 ...
- [四校联考P3] 区间颜色众数 (主席树)
主席树 Description 给定一个长度为 N 颜色序列A,有M个询问:每次询问一个区间里是否有一种颜色的数量超过了区间的一半,并指出是哪种颜色. Input 输入文件第一行有两个整数:N和C 输 ...
- [20190113]四校联考
T1 数位DP,太菜了打挂只有10分-- Code //2019.1.14 12:25~12:47 PaperCloud #include<bits/stdc++.h> #define l ...
- [4.9福建四校联考]
来自FallDream的博客,未经允许,请勿转载 奇怪的O(n)大赛,三道题数据都是几百万,真吓人. ------------------------------------------------- ...
- 2017-3-19四校联考
T1输出0有20分结果我输出1爆0(题目说精度差为整数有40%的分数,结果告诉我只能差0.5--),T2打了20分暴力,T3交了个感觉能拿50分的结果是正解--被卡常了一个点,总分110/300 T1 ...
- 2/19 福建四校联考
1.设计图案 给你一个n*m的矩阵,每个格子必须填或者不能填,要用环和1*2的小方块填满它,求方案数. 比如3*2,每个格子都必须填 有6种填法. n*m<=300 当时一看就觉得不可做然后就放 ...
- [20180812]四校联考
T1 消失的无向图(missing) 题目描述 从前有一张n个点的无向图,边权都是正整数.但现在所有的边都消失了,只留下任意两点之间的最短路. 你现在想知道,所有边的边权和至少是多少. 输入格式 ...
- [20180819]四校联考
不要问我8.19的题为什么今天才写完,因为我弱啊 T1 扫雷(mine) Problem戳这里 Solution: 显然,\(ans = min_{i=1}^n \frac{bi}{ai}\),令cn ...
- 4246. 【五校联考6day2】san (Standard IO)
4246. [五校联考6day2]san (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Detailed Limits D ...
最新文章
- 在iOS 8中使用UIAlertController
- 服务端高并发分布式架构演进之路【转】
- Tensorflow实例3: 验证码图片的识别训练,每张图片有4个字母
- oracle insert if语句怎么写,oracle存储过程的调用(insert 语句的存储过程)
- Android--OkHttp理解系列(一)
- Flex 常见问题解答(from MM)
- 总结get和post区别
- python不同曲线设置标签_【图像分类】基于Pascal VOC2012增强数据的多标签图像分类实战...
- LeetCode 665 非递减数列
- 如何使用Postman和Newman在CI环境中自动化REST API端到端测试
- 家族关系查询系统程序设计算法思路_七大查找算法(附C语言代码实现)
- Enfocus PitStop Pro 2021 for Mac(pdf增强插件)
- Office 2003如何打开后缀名为docx的Microsoft Word 文档
- windows设置cmd命令行背景为半透明
- 内存Available 是怎么计算的
- 读写三维数据.stl文件
- [UML]建模是什么?为什么要建模?
- 什么叫少儿机器人编程
- np.savetxt()和np.loadtxt()
- GIS--矢量数据,栅格数据,切片,瓦片,金字塔的概念
热门文章
- 小程序view设置背景图片_小程序商城分销功能设置技巧 设计方法
- YShout一款PHP+TXT+Ajax嵌入式在线聊天室源码
- html实现页面弹球,使用html+css+js实现弹球游戏
- java统计文件字符数量_Java统计文件注释个数和注释字符数
- 2020恩智浦智能车大赛规则_2020年世界人工智能围棋大赛落幕,各路围棋AI共同论道...
- js 判断移动端还是pc端,ios或者android
- 云开发无需服务期无需域名壁纸小程序源码
- 苹果cmsV10高仿草民电影网在线影视网站模板 带手机版
- PHP文字转语音合成网源码 百度API开发
- js底部广告飘窗代码