Codeforces Round #228 (Div. 2) D - Fox and Minimal path

2024-05-29 07:38

本文主要是介绍Codeforces Round #228 (Div. 2) D - Fox and Minimal path,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前三题 没有什么可以说的 水题, 但是 B题 大意了,最后WA了,所以 rating 大降 T_T. 

何时才能进DIV1 啊。 

D题, 当时 交了一发,不过被HACK了,因为考虑不全面。 当时的想法是把 K 分解为1000 内的因数相乘 而且 这些因数的和<=1000。这样显然是不正确的,因为可能根本找不到这些符合条件的因数。

之后,考虑分解为二进制,之后是相乘之积 相加。上面的错误之处也就是在于全是相乘。

用这个思路分解,比如用二进制分解  K=5, 可以这么构造k=5=2*2+1*1;

 又在赛后写了一发, 在一个28个1的二进制的数上过不去, 经过计算,这样的构造方法会使节点的数目超过1000.   

所以考虑其他进制的分解,可以粗略算得  十进制的构造方法最糟不会超过800多节点,故可行。 10进制的方法和二进制思路一样。

code:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF 1000000000
#define N 1005
int n,k;
bool vis[N][N];
char s[100];
int main()
{scanf("%d",&k);sprintf(s,"%d",k);int len=strlen(s);memset(vis,0,sizeof(vis));int now=2,last;for(int i=0;i<len;i++){int tmp=s[i]-'0';if(!tmp) continue;for(int j=1;j<=tmp;j++){vis[1][now+j]=vis[now+j][1]=1;}last=now;now+=tmp;int need=len-i-1;for(int j=1;j<=need;j++){last=now;if(j==1){for(int p=now-tmp+1;p<=now;p++)for(int q=now+1;q<=now+10;q++)vis[p][q]=vis[q][p]=1;}else{for(int p=now-9;p<=now;p++)for(int q=now+1;q<=now+10;q++)vis[p][q]=vis[q][p]=1;}now+=10;}if(i==0){for(int q=last+1;q<=now;q++)  vis[q][2]=vis[2][q]=1;}for(int j=1;j<=i;j++){if(j==1){for(int p=last+1;p<=now;p++) vis[p][now+1]=vis[now+1][p]=1;now++;}else{vis[now][now+1]=vis[now+1][now]=1;now++;}if(j==i) vis[now][2]=vis[2][now]=1;}}printf("%d\n",now);for(int i=1;i<=now;i++){for(int j=1;j<=now;j++){if(vis[i][j]) printf("Y");else printf("N");}puts("");}return 0;
}

 ----------------------------------------------------------------------------------------------------------------------------------

额 , 发现 二进制分解构造 是可行的 , 而且 结果会更优 , 不会超过100 个点的。

比如 , K=12;  1110(二进制)


除去 1  2 两点 分为 3层,列数决定于 二进制的位数,前2层构造完成,就构造出了最高位的方案数 样例中的8种。 再构造出 4+2 种就完成了。

就如图,连接红色的边,就完成了。  如果需要1种,就把 1 点 和左下角的点连接即可。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF 1000000000
#define N 1005
int k,n;
bool vis[N][N];
int m[N],ad,mark,now=2;
void sol()
{if(mark==0){vis[1][2]=vis[2][1]=1; return ;}vis[1][4]=vis[1][5]=vis[4][1]=vis[5][1]=1;for(int i=2;i<=mark;i++){vis[i*3+1][i*3-2]=vis[i*3-2][i*3+1]=vis[i*3+2][i*3-1]=vis[i*3-1][i*3+2]=1;vis[i*3+2][i*3-2]=vis[i*3-2][i*3+2]=vis[i*3+1][3*i-1]=vis[i*3-1][i*3+1]=1;vis[i*3][i*3-3]=vis[i*3-3][i*3]=1;}vis[mark*3][2]=vis[2][mark*3]=vis[mark*3+1][2]=vis[2][mark*3+1]=vis[mark*3+2][2]=vis[2][mark*3+2]=1;for(int i=0;i<mark;i++){if(m[i] & (!i) ){vis[1][3]=vis[3][1]=1; continue;}if(m[i]) vis[3*i+3][3*i+1]=vis[3*i+1][3*i+3]=vis[3*i+3][3*i+2]=vis[3*i+2][3*i+3]=1;}now+=mark*3;
}
int main()
{scanf("%d",&k);memset(vis,0,sizeof(vis));ad=-1;for(int i=0;i<=31;i++){int tmp=(k>>i)&1;m[++ad]=tmp;}for(int i=32;i>=0;i--){if(m[i]){mark=i; break;}}sol();printf("%d\n",now);for(int i=1;i<=now;i++){for(int j=1;j<=now;j++){printf("%c",vis[i][j]==1? 'Y':'N');}puts("");}return 0;
}


这篇关于Codeforces Round #228 (Div. 2) D - Fox and Minimal path的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1013048

相关文章

【服务器运维】CentOS6 minimal 离线安装MySQL5.7

1.准备安装包(版本因人而异,所以下面的命令中版本省略,实际操作中用Tab自动补全就好了) cloog-ppl-0.15.7-1.2.el6.x86_64.rpmcpp-4.4.7-23.el6.x86_64.rpmgcc-4.4.7-23.el6.x86_64.rpmgcc-c++-4.4.7-23.el6.x86_64.rpmglibc-2.12-1.212.el6.x86_64.r

【服务器运维】CentOS7 minimal 离线安装 gcc perl vmware-tools

0. 本机在有网的情况下,下载CentOS镜像 https://www.centos.org/download/ 1. 取出rpm 有的情况可能不需要net-tools,但是如果出现跟ifconfig相关的错误,就把它安装上。另外如果不想升级内核版本的话,就找对应内核版本的rpm版本安装 perl-Time-Local-1.2300-2.el7.noarch.rpmperl-Tim

Android自定义系列——9.Path详细用法

rXxx方法 rXxx方法的坐标使用的是相对位置(基于当前点的位移),而之前方法的坐标是绝对位置(基于当前坐标系的坐标)。 Path path = new Path();path.moveTo(100,100);path.lineTo(100,200);canvas.drawPath(path,mDeafultPaint); 在这个例子中,先移动点到坐标(100,100)处,之后再连接

Android自定义系列——8.Path之贝塞尔曲线

贝塞尔曲线能干什么 贝塞尔曲线作用十分广泛,简单举几个的栗子: QQ小红点拖拽效果一些炫酷的下拉刷新控件阅读软件的翻书效果一些平滑的折线图的制作很多炫酷的动画效果 理解贝塞尔曲线的原理 一阶曲线原理: 一阶曲线是没有控制点的,仅有两个数据点(A 和 B),最终动态过程如下: (本文中贝塞尔曲线相关的动态演示图片来自维基百科)。一阶曲线其实就是前面讲解过的lineTo。 二阶曲线

Android自定义系列——7.Path之基本操作

Path常用方法表 为了兼容性(偷懒) 本表格中去除了部分API21(即安卓版本5.0)以上才添加的方法。 作用相关方法备注移动起点moveTo移动下一次操作的起点位置设置终点setLastPoint重置当前path中最后一个点位置,如果在绘制之前调用,效果和moveTo相同连接直线lineTo添加上一个点到当前点之间的直线到Path闭合路径close连接第一个点连接到最后一个点,形成一个闭合

Codeforces 158B

很久没有刷题了,刚刚有小学弟问了这道题,AC之后贴上来吧。水~~~ #include <cstdio>#include <cmath>int main() {int n;while(scanf("%d", &n) != EOF) {int a = 0, b = 0, c = 0, d = 0;int arr[100001];for (int i = 0; i < n; ++

Codeforces April Fools Day Contest 2014(附官方题解)

Codeforces2014年愚人节的坑题。。。但还是感觉挺好玩的。。。 A. The Great Game time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Two teams mee

Codeforces April Fools Day Contest 2013

2013年愚人节的坑题。。。 A. Mysterious strings time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Input The input contains a sin

从PATH说起的shell命令行替换

许久之前,师弟问了我一个问题,为什么shell中添加环境变量的写法是下面这种方式 PATH=~/.lib:$PATH; export PATH 而下面这种会报错呢? $PATH=~/.lib:$PATH; export PATH 当时我的回答是,"shell就是这样子规定的呀"。 回答的同时,也突然间发现有些自己感觉很熟悉的概念,原来自己并没有那么清楚,因此这一篇讲讲shell的命令行

Java环境变量配置中有关JAVA_HOME,path,Classpath含义的讲解

一:Path变量 Path变量是操作系统的,用以找寻相关命令的。例如ping这个命令,你能在控制行里打ping 127.0.0.1而有程序执行并正确返回结果,是因为Path变量包含C:\Windows\System32。你可以在Path中把C:\Windows\System32去掉,再使用ping命令,就会提示找不到ping命令。 这就像你在你的办公桌上工作,需要用到各种工具,如钢笔,