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. 牛客多校Round 10

    咕咕咕.... 去烽火台和兵马俑了

  2. wpf 自定义单选按钮 RadioButton

    新建RadioButtonEx.cs public class RadioButtonEx : RadioButton { public Geometry SelectIcon { get { ret ...

  3. 常用HTML5代码片段

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  4. mysql服务无法启动(1067错误)时数据备份的经验

    mysql服务无法启动(1067错误)时数据备份的经验 背景 方法 背景 在已安装MySQL5.5的情况下,再次安装 MySQL5.7时,因为MySQL5.7是压缩文件安装的方式,复制MySQL5.5 ...

  5. java一维数组的声明、初始化及排序

    public class TestArray { public static void main(String[] args) { /** 数组声明及动态初始化 int a[] = new int[a ...

  6. Servlet的说明及使用案例

    Servlet的说明及使用案例 制作人:全心全意 Servle的基础介绍 Servlet结构体系 Servlet对象.ServletConfig对象与Serializable对象是接口对象,其中Ser ...

  7. Shock wave

    ** shock wave thickness of shock wave is order of 1e-7 m why governed by Euler Equation? P334 shock ...

  8. SQL学习笔记:基础SQL语句

    目录 语句特点 进入数据库 基本查询语句 SELECT DISTINCT WHERE AND/OR/NOT :逻辑运算符 ORDER BY :排序 基本修改语句 INSERT:添加语句 UPDATE: ...

  9. ndk编译libpcap 1.7.4

    android完全菜鸟,绝对的第一次接触,想做手机抓包,在网上搜又是NDK 又是JNI 又是JNETPCAP 完全蒙了,让我这种android和java都弄不明白什么关系的人情何以堪! 静下心想一想, ...

  10. 九度oj 题目1049:字符串去特定字符

    题目1049:字符串去特定字符 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:10173 解决:4611 题目描述: 输入字符串s和字符c,要求去掉s中所有的c字符,并输出结果. 输入: ...