热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[考试反思]0515省选模拟97:构造

T1:心的旋律(circle)T2:幻化成风(count)T3:大

技术图片

技术图片

我好菜啊。。。数学不会数据结构不会博弈不会图论也不会,现在构造也不会了。。。

今天看似来了俩构造。然而一个是凭空想象的结论题(好难证。。。)还有一个是提答

于是我就凭空想象了,然而我菜所以猜错了,然后炸了,倒是也比多数人多了$10pts$

于是我就去提答了,然而这道题如果想认真写的话分数都不低,然后拿了个大概大众分就结束了

然后最后还有点时间写$T2$暴力的$20pts$来着 ,这时候突然钻出来了一个牛爷爷(窗口抖动)问我提答怎么交

我懵了(为啥不直接问教练),然后反正我最后暴力没交上去,我就无了

(牛爷爷天天$rk1$啊,这不是我说的)

(话说以前提答题都是怎么交上去的。。?)

T1:心的旋律(circle)

大意:构造一个两侧都有$n$个点的二分图,要求$k = \sum\limits_{A \subseteq [1,n]} [ |f(A)|<|A| ] $。$f(A)$指$A$集合点的所有出边到达的点的并集。$n \le 32,k \le 2^n$

首先$<$的限制比较麻烦,我们把条件改成大于等于(同时把$k$也改成$2^n-k$)。把$\sum$那个式子叫做一个图的 对应值 。

首先如果$k=0$,由于空集的存在,无解。

然后我们只要猜到:可以构造一种图满足左侧点连的右侧点集合为包含关系,且如果存在大小为$x$的集合就存在大小为$x-1$的集合。

为了方便我们强制集合就是一个$[1,size_i]$的前缀。同时把所有左侧点按照$size$排序。

然后这个图就相当于一个单调不减的$size$序列且满足$0 \le size_{i-1} \le size_i \le 1$。

我们设所有$size_i - size_{i-1} =1$的位置$i$我们把它丢进一个$B$集合里。设$m=|B|$

那么这个图的对应值就是:

$\sum\limits_{i=1}^{m} \binom{n}{i} - \sum\limits_{i=1}^{m} \binom{B_i-1}{i}$

需证:

1)对于任意$m$,大小为$m+1$的$B$集合对应的值比大小为$m$的大(设这个问题为$proof(n,m)$)

也就是说,大小为$m+1$的$B$集合对应的最小值 比 大小为$m$的$B$集合的对应最大值 要大。

我们作差一下,减号前面的部分抵消只剩下一项$\binom{n}{m+1}$

大小为$m+1$的集合要尽量小,也就是后面减去的集合要尽量大,那么就满足$B_i=n+i-(m+1)$

然后后面的那堆组合数就是$\sum\limits_{i=1}^{m+1} \binom{n+i-m-2}{i}$

这是一条斜线上的组合数求和,也就相当于是一列,直接组合恒等式干掉,得到这玩意就是$\binom{n}{m+1}-1$

所以$minval(m+1)-maxval(m)=1$

2)对于$m$相同时,$B$对应二进制下较大的,对应值较小

也就是说,两个$B$对位比较,第一次错开的位置,两数中较大者,对应值更小。

于是我们就直接从这个第一次错开的位置开始考虑,假如更高位上已经有$x$个$1$然后当前位是$M$。

我们发现我们需要证明的就是$proof(M-1,m-x-1)$。所以也已经证出来了。

3)每种$B$集合都与一个$0<\le 2^n$对应值一一对应。

上面的证明中,我们已经知道了在刚才的比较关系中,$min-max=1$也就是元素是两两相邻,$B$为空时显然是$1$。故得证。

综上,$B$集合写成二进制数后,第一关键字为1$的个数$第二关键字为权值排序后,排名为$i$的数对应值就是$i$(排名从$1$开始)

然后就逐位确定地构造一下就行了。枚举$1$的个数再枚举每一位填啥。

T2:幻化成风(count)

不会。有空回来补$60pts$暴力。营养丰富。

T3:大家佛(cut)

大意:提答。给定$n \times m$权值随机的矩阵,要求你把它分成$k$个联通块,使得块和最大值-块和最小值尽量小。

给出$84pts$的生成代码。

技术图片技术图片
 1 #include
 2 using namespace std;
 3 char input[10],output[10];
 4 int n,m,w,k,mtx[1005][1005];long long tot;
 5 int pre[1000],ans[1005][1005];
 6 int main(){
 7     for(int test=1;test<=10;++test){
 8         sprintf(input,"cut%d.in",test);freopen(input,"r",stdin);
 9         sprintf(output,"cut%d.out",test);freopen(output,"w",stdout);
10         
11         scanf("%d%d%d%d",&n,&m,&k,&w);tot=0;
12         for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)scanf("%d",&mtx[i][j]),tot+=mtx[i][j];
13         
14         if(test==1){
15             puts("1 1 1 1 1 1 1 1 1 1");
16             puts("1 1 1 1 1 1 1 1 1 1");
17             puts("2 2 2 2 2 2 2 1 1 2");
18             puts("2 2 2 2 2 2 2 2 2 2");
19             puts("3 3 3 3 3 2 2 2 2 2");
20             puts("3 3 3 3 3 3 3 3 3 3");
21             puts("4 4 4 4 4 4 3 3 3 3");
22             puts("4 4 4 4 4 4 4 4 4 4");
23             puts("4 5 4 5 5 5 5 5 5 5");
24             puts("5 5 5 5 5 5 5 5 5 5");
25         }
26         if(test==2){
27             puts("1 1 1 1 3");
28             puts("1 2 2 1 3");
29             puts("1 2 2 1 3");
30             puts("1 2 2 2 3");
31             puts("3 3 3 3 3");
32         }
33         if(test==3){
34             puts("1 1 1 1 1");
35             puts("2 2 2 1 1");
36             puts("2 2 2 2 1");
37             puts("3 2 3 3 3");
38             puts("3 3 3 3 3");
39         }
40         if(test==4){
41             int p=1,tot=0,co=1;
42             while(p<=m){
43                 if(tot+mtx[1][p]+mtx[2][p]+mtx[3][p]<=60)ans[1][p]=ans[2][p]=ans[3][p]=co,tot+=mtx[1][p]+mtx[2][p]+mtx[3][p];
44                 else if(tot+mtx[1][p]+mtx[2][p]<=60)ans[1][p]=ans[2][p]=co,ans[3][p]=++co,tot=mtx[3][p];
45                 else if(tot+mtx[1][p]+mtx[3][p]<=60)ans[1][p]=ans[3][p]=co,ans[2][p]=++co,tot=mtx[2][p];
46                 else if(tot+mtx[2][p]+mtx[3][p]<=60)ans[2][p]=ans[3][p]=co,ans[1][p]=++co,tot=mtx[1][p];
47                 else if(tot+mtx[1][p]<=60)ans[1][p]=co,ans[2][p]=ans[3][p]=++co,tot=mtx[2][p]+mtx[3][p];
48                 else if(tot+mtx[2][p]<=60)ans[2][p]=co,ans[1][p]=ans[3][p]=++co,tot=mtx[1][p]+mtx[3][p];
49                 else ans[1][p]=ans[2][p]=ans[3][p]=++co,tot=mtx[1][p]+mtx[2][p]+mtx[3][p];
50                 p++;
51             }
52             for(int i=1;i<=n;++i,puts(""))for(int j=1;j<=m;++j)printf("%d ",ans[i][j]),ans[i][j]=0;
53         }
54         
55         if(test==5){
56             for(int x=1;x<=k;++x){
57                 int tg=tot/k+(x<=tot%k);
58                 for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)if(!ans[i][j]&&tg>=mtx[i][j])ans[i][j]=x,tg-=mtx[i][j];
59             }
60             for(int i=1;i<=n;++i,puts(""))for(int j=1;j<=m;++j)printf("%d ",ans[i][j]);
61         }
62         
63         if(test>=6&&test!=9){
64             for(int i=1;i<=k;++i)pre[i]=pre[i-1]+n*m/k+(i<=n*m%k);
65             pre[k+1]=pre[k]+1;
66             int tot=0,x=1,y=1,p=1;
67             while(x<=n){
68                 tot++;
69                 if(tot>pre[p])p++;
70                 ans[x][y]=p;
71                 if(x&1){if(y==m)x++;else y++;}
72                 else{if(y==1)x++;else y--;}
73             }
74             for(int i=1;i<=n;++i,puts(""))for(int j=1;j<=m;++j)printf("%d ",ans[i][j]),ans[i][j]=0;
75         }
76         
77         if(test==9){
78             for(int i=1;i<=n;++i,puts(""))for(int j=1;j<=m;++j)printf("%d ",(j-1)/(n/k)+1);
79         }
80         
81     }
82 }
View Code

对于较大的数据,可以蛇行走位遍历整个矩阵然后按照权值砍蛇。可以优化到$92pts$

[考试反思]0515省选模拟97:构造


推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
author-avatar
杰_Jb_131
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有