[bzoj3274]Circle
https://www.zybuluo.com/ysner/note/1243396
题面
有\(n\)个排成一圈的格子,并且已知正整数\(k\)和\(m\),你需要往每个格子中填入一个大于等于\(k\)的正整数。将相邻的一些格子(或一个单独的格子)中的数加起来,可以产生一个新的数。假设使用格子中的数可以产生出\(m,m+1,…i\),但不能产生\(i+1\)。求出往格子中填入哪些数,可以使得\(i\)尽量大。
对于同一个环,输出字典序最小的方案。
- \(30pts\ n\leq5\)
- \(100pts\ n\leq6,m,k\leq20\)
解析
看这部分分分布就知道是暴搜+剪枝。
\(30pts\)算法
卡着复杂度枚举每个数,再枚举两端点找出产生的所有数即可。(好像是\(k~k+18\))
至于怎么去重,我傻逼地打了哈希,只能过样例。
实际上保证后面每位数不比第一位小就可以了啊。
\(100pts\)算法
可以打表发现,填入的数最大为\(k+15\)。
于是继续暴枚就能过了。
复杂度\(O(16^6n^2)=O(6*10^8)\),然而由于前面枚举的限制,复杂度不满(除以\(6\))。
附上题解剪枝:
假设当前已经确定前\(k\)个格子中的数。将前\(k\)个格子不能产生的大于等于\(m\)的数从小到大排序,设为\(a_1,a_2,...\)。假设由后面\(n-k\)个格子最多可以再产生\(x\)个数,则第\(k+1\)个数不能超过 \(a[x]\)。
加上这个剪枝似乎快\(3\)倍,然而懒得打。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<map>
#define re register
#define il inline
#define ll long long
#define q 15
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define fp(i,a,b) for(re int i=a;i<=b;i++)
#define fq(i,a,b) for(re int i=a;i>=b;i--)
using namespace std;
const int mod=1e9+7,N=20,M=1e5+100;
int n,m,k,a[N],ans[M][N],tot,p[N],tong[M],anss,top;
ll jc[70];
map<ll,bool>vis;
il ll gi()
{
re ll x=0,t=1;
re char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') t=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*t;
}
il int check()
{
fp(i,n+1,n+n) a[i]=a[i-n];
fp(i,1,n+n) p[i]=p[i-1]+a[i];
fp(i,1,p[n+n]) tong[i]=0;
fp(l,1,n)
fp(r,l,l+n-1)
tong[p[r]-p[l-1]]=1;
re int x=m;
while(tong[x]) ++x;--x;
if(x>anss) {anss=x;tot=0;return 1;}
return (x==anss);
}
int main()
{
freopen("circle.in","r",stdin);
freopen("circle.out","w",stdout);
jc[0]=1;fp(i,1,60) jc[i]=jc[i-1]*2;
n=gi();m=gi();k=gi();
if(n==5)
for(a[1]=k;a[1]<=k+q;a[1]++)
for(a[2]=a[1];a[2]<=k+q;a[2]++)
for(a[3]=a[1];a[3]<=k+q;a[3]++)
for(a[4]=a[1];a[4]<=k+q;a[4]++)
for(a[5]=a[1];a[5]<=k+q;a[5]++)
if(check()) ans[++tot][1]=a[1],ans[tot][2]=a[2],ans[tot][3]=a[3],ans[tot][4]=a[4],ans[tot][5]=a[5];
if(n==6)
for(a[1]=k;a[1]<=k+q;a[1]++)
for(a[2]=a[1];a[2]<=k+q;a[2]++)
for(a[3]=a[1];a[3]<=k+q;a[3]++)
for(a[4]=a[1];a[4]<=k+q;a[4]++)
for(a[5]=a[1];a[5]<=k+q;a[5]++)
for(a[6]=a[1];a[6]<=k+q;a[6]++)
if(check()) ans[++tot][1]=a[1],ans[tot][2]=a[2],ans[tot][3]=a[3],ans[tot][4]=a[4],ans[tot][5]=a[5],ans[tot][6]=a[6];
printf("%d\n",anss);
fp(i,1,tot)
{
fp(j,1,n) printf("%d ",ans[i][j]);puts("");
}
fclose(stdin);
fclose(stdout);
return 0;
}
[bzoj3274]Circle的更多相关文章
- [翻译svg教程]svg中的circle元素
svg中的<circle> 元素,是用来绘制圆形的,例如 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink= ...
- 设计一个程序,程序中有三个类,Triangle,Lader,Circle。
//此程序写出三个类,triangle,lader,circle:其中triangle类具有类型为double的a,b,c边以及周长,面积属性, //具有周长,面积以及修改三边的功能,还有判断能否构成 ...
- c++作业:Circle
Circle Github链接
- Modified Least Square Method and Ransan Method to Fit Circle from Data
In OpenCv, it only provide the function fitEllipse to fit Ellipse, but doesn't provide function to f ...
- [javascript svg fill stroke stroke-width circle 属性讲解] svg fill stroke stroke-width circle 属性 绘制圆形及引入方式讲解
<!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title ...
- (1)编写一个接口ShapePara,要求: 接口中的方法: int getArea():获得图形的面积。int getCircumference():获得图形的周长 (2)编写一个圆类Circle,要求:圆类Circle实现接口ShapePara。 该类包含有成员变量: radius:public 修饰的double类型radius,表示圆的半径。 x:private修饰的double型变量x,
package com.hanqi.test; //创建接口 public interface ShapePara { //获取面积的方法 double getArea(); //获取周长的方法 do ...
- 东大oj-1591 Circle of friends
题目描述 Nowadays, "Circle of Friends" is a very popular social networking platform in WeChat. ...
- svg学习(四)circle
<circle> 标签 < <?xml version="1.0" standalone="no"?> <!DOCTYPE ...
- 后缀数组 --- WOj 1564 Problem 1564 - A - Circle
Problem 1564 - A - Circle Problem's Link: http://acm.whu.edu.cn/land/problem/detail?problem_id=156 ...
随机推荐
- 梦想CAD控件系统变量说明
这里介绍一些常用系统变量有String.double.long.McGePoint3d等类型,其中有部分系统变量是随图纸保存,再次打开时就会读取图纸中的系统变量,有些系统变量不随图纸保存,其作用来控制 ...
- 【Redis】四、Redis设计原理及相关问题
(六)Redis设计原理及相关问题 通过前面关于Redis五种数据类型.相关高级特性以及一些简单示例的使用,对Redis的使用和主要的用途应该有所掌握,但是还有一些原理性的问题我们在本部分做一个探 ...
- Fleecing the Raffle(NCPC 2016 暴力求解)
题目: A tremendously exciting raffle is being held, with some tremendously exciting prizes being given ...
- 首次开通blog,以后会慢慢把oneNote和印象笔记的笔记转过来
之前一直都是把笔记和经验写到OneNote上面,终于,OneNote无法同步了,转战blog吧,在这上面写一些笔记和一些技术,有空可以慢慢回顾一下.笔记这种东西,过一段时间再看就会有不同的感悟.
- 【nginx】记录nginx+php-fpm实现大文件下载排坑的过程
先上一段代码,支持大文件下载和断点续传,代码来源互联网. set_time_limit(0); // 省略取文件路径的过程,这里直接是文件完整路径 $filePath = get_save_path( ...
- 网络基础——TCP
TCP和UDP协议特点 1.TCP 1>.传输控制协议 2>.可靠的.面向连接的协议 3>.传输效率低 2.UDP 1>.用户数据报协议 2>.不可靠的.无连接的服务 3 ...
- react入门----组件的基础用法
1.组件 <!-- React 允许将代码封装成组件(component),然后像插入普通 HTML 标签一样,在网页中插入这个组件.React.createClass 方法就用于生成一个组件类 ...
- 洛谷 1091 合唱队形(NOIp2004提高组)
[题解] 分别做一遍最长上升序列和最长下降序列,再枚举峰的位置计算答案即可. #include<cstdio> #include<algorithm> #include< ...
- type="application/javascript"
type="application/javascript" html script 标签中 type有如下这些值,请问分别是什么意思,在什么情况下使用? type="te ...
- Maven项目pom.xml报错
1.org.apache.maven.archiver.MavenArchiver.getManifest报错 pom.xml第一行报错,如图: 解决办法: 第一步: help ->Instal ...