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的更多相关文章

  1. [翻译svg教程]svg中的circle元素

    svg中的<circle> 元素,是用来绘制圆形的,例如 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink= ...

  2. 设计一个程序,程序中有三个类,Triangle,Lader,Circle。

    //此程序写出三个类,triangle,lader,circle:其中triangle类具有类型为double的a,b,c边以及周长,面积属性, //具有周长,面积以及修改三边的功能,还有判断能否构成 ...

  3. c++作业:Circle

    Circle Github链接

  4. 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 ...

  5. [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 ...

  6. (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 ...

  7. 东大oj-1591 Circle of friends

    题目描述 Nowadays, "Circle of Friends" is a very popular social networking platform in WeChat. ...

  8. svg学习(四)circle

    <circle> 标签 < <?xml version="1.0" standalone="no"?> <!DOCTYPE ...

  9. 后缀数组 --- WOj 1564 Problem 1564 - A - Circle

    Problem 1564 - A - Circle Problem's Link:   http://acm.whu.edu.cn/land/problem/detail?problem_id=156 ...

随机推荐

  1. 梦想CAD控件系统变量说明

    这里介绍一些常用系统变量有String.double.long.McGePoint3d等类型,其中有部分系统变量是随图纸保存,再次打开时就会读取图纸中的系统变量,有些系统变量不随图纸保存,其作用来控制 ...

  2. 【Redis】四、Redis设计原理及相关问题

    (六)Redis设计原理及相关问题   通过前面关于Redis五种数据类型.相关高级特性以及一些简单示例的使用,对Redis的使用和主要的用途应该有所掌握,但是还有一些原理性的问题我们在本部分做一个探 ...

  3. Fleecing the Raffle(NCPC 2016 暴力求解)

    题目: A tremendously exciting raffle is being held, with some tremendously exciting prizes being given ...

  4. 首次开通blog,以后会慢慢把oneNote和印象笔记的笔记转过来

    之前一直都是把笔记和经验写到OneNote上面,终于,OneNote无法同步了,转战blog吧,在这上面写一些笔记和一些技术,有空可以慢慢回顾一下.笔记这种东西,过一段时间再看就会有不同的感悟.

  5. 【nginx】记录nginx+php-fpm实现大文件下载排坑的过程

    先上一段代码,支持大文件下载和断点续传,代码来源互联网. set_time_limit(0); // 省略取文件路径的过程,这里直接是文件完整路径 $filePath = get_save_path( ...

  6. 网络基础——TCP

    TCP和UDP协议特点 1.TCP 1>.传输控制协议 2>.可靠的.面向连接的协议 3>.传输效率低 2.UDP 1>.用户数据报协议 2>.不可靠的.无连接的服务 3 ...

  7. react入门----组件的基础用法

    1.组件 <!-- React 允许将代码封装成组件(component),然后像插入普通 HTML 标签一样,在网页中插入这个组件.React.createClass 方法就用于生成一个组件类 ...

  8. 洛谷 1091 合唱队形(NOIp2004提高组)

    [题解] 分别做一遍最长上升序列和最长下降序列,再枚举峰的位置计算答案即可. #include<cstdio> #include<algorithm> #include< ...

  9. type="application/javascript"

    type="application/javascript" html script 标签中 type有如下这些值,请问分别是什么意思,在什么情况下使用? type="te ...

  10. Maven项目pom.xml报错

    1.org.apache.maven.archiver.MavenArchiver.getManifest报错 pom.xml第一行报错,如图: 解决办法: 第一步: help ->Instal ...