1.前言

  = =

  感觉自己其实没发过关于考试的博客过...

  今天是一个平安的夜晚,漆黑的夜被霓虹划分成网络,很适合发题。

2.num9九数码问题

  传统8数码改一下...只询问一个状态,所以很容易搞,正向广搜即可。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm> using namespace std; const int maxn=+; int ans[];
int level[];
int a[maxn][];
int que[maxn],rec[maxn],pre[maxn];
int Hash[maxn]; int get_h(int a[]){
int sum=,cnt;
for(int i=;i<;i++){
cnt=;
for(int j=i+;j<;j++)
if(a[j]<a[i]) cnt++;
sum+=cnt*level[-i];
}
return sum;
} void change1(int L[],int N[]){
N[]=L[],N[]=L[],N[]=L[];
N[]=L[],N[]=L[],N[]=L[];
N[]=L[],N[]=L[],N[]=L[];
} void change2(int L[],int N[]){
N[]=L[],N[]=L[],N[]=L[];
N[]=L[],N[]=L[],N[]=L[];
N[]=L[],N[]=L[],N[]=L[];
} void print(int a[]){
printf("%d %d %d\n%d %d %d\n%d %d %d\n\n",a[],a[],a[],a[],a[],a[],a[],a[],a[]);
} void dfs(int p){
if(!p) return;
dfs(pre[p]);
print(a[p]);
} void BFS(){
int H=,T=,key; pre[]=;key=get_h(a[]);Hash[key]=;que[]=key; while(H+<T){
H++;
change1(a[H],a[T]);
key=get_h(a[T]);
if(!Hash[key]){
Hash[key]=Hash[que[H]]+,que[T]=key,rec[key]=T,pre[T]=H,T++;
if(!key){
int p=T-;
printf("%d\n",Hash[]-);
dfs(p);
return ;
}
} change2(a[H],a[T]);
key=get_h(a[T]);
if(!Hash[key]){
Hash[key]=Hash[que[H]]+,que[T]=key,rec[key]=T,pre[T]=H,T++;
if(!key){
int p=T-;
printf("%d\n",Hash[]-);
dfs(p);
return ;
}
}
}
printf("UNSOLVABLE");
} int main(){
freopen("num9.in","r",stdin);
freopen("num9.out","w",stdout); level[]=;
for(int i=;i<=;i++) level[i]=level[i-]*i; for(int i=;i<;i++)
scanf("%d",&a[][i]); BFS();
return ;
}

3.lunch午餐问题

  这种题看上去是贪心的样子,于是考场上先推一推式子,找找关系。

  

  感觉这一步还是比较好弄的,但是因为有两个队列,究竟放那一个去呢?

  当时想,要不贪心放在等候时间较短的那边?

  后来觉得不靠谱,因为要是下一个等待时间太长,导致后面的全部放了都没他慢,这时候放在更长的那边可能好些。

  就想要不然增加几个选择,枚举一下每一列放几个?...可是枚举的时候出现问题了——没有考虑时间的影响,而是将时间作为结果放在的数组里。

  事实上,只有两个都确定时,这个状态才算完全固定,而若是像我将前i个放j个在第一个队列这种其实不具有转移的性质的。

  因为如果在f[i][j]取到最优值的时候,不一定时间上就是最优。所以说这样的转移不一定就是最优值,因为转移的时候调用了一个由转移得到的值!

  事后终于醒悟了。感觉自己定这个状态就是为了转移方程好转移啊!

  设计的时候一定要注意需要什么信息,什么信息可以用来转移,什么信息只是做一个结果。[果然这个叫信息竞赛啊...]感觉今天终于醒悟还是蛮好的。

  上最后AC代码。

  

#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; const int maxn=;
const int INF=0x7fffffff; int n;
int ans; struct Node{
int a,b;
}s[maxn]; bool cmp(const Node &A,const Node &B){
return A.b>B.b;
} int sum[maxn];
int f[maxn][maxn*maxn]; int main(){
freopen("lunch.in","r",stdin);
freopen("lunch.out","w",stdout); scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d%d",&s[i].a,&s[i].b);
sort(s+,s+n+,cmp);
for(int i=;i<=n;i++)
sum[i]=sum[i-]+s[i].a; memset(f,0x7f,sizeof(f));
f[][]=;
for(int i=;i<=n;i++)
for(int j=;j<=sum[i-];j++){
f[i][j]=min(f[i][j],max(f[i-][j],sum[i-]-j+s[i].a+s[i].b));
f[i][j+s[i].a]=min(f[i][j+s[i].a],max(f[i-][j],j+s[i].a+s[i].b));
} ans=INF;
for(int i=;i<=sum[n];i++)
ans=min(ans,f[n][i]); printf("%d",ans);
return ;
}

4.沼泽鳄鱼

5.梦幻折纸

  

Problem

  给一个N*M的格子,每个格子都写有一个1~N*M的数字。判断是否能将这张格子折叠成1*1,使得第1层标号为1,使得第2层标号为2...,第i层标号为i...。
  1 7
  3 1 7 6 5 4 2
  AllRight

  2 2
  1 2
  3 4
  Cheat

  2 3
  2 1 6
  3 4 5
  Allright

  4 4
  11 12 15 14
  10  9 16 13
   5  8  1  2
   6  7  4  3
  Allright

  对于四个样例,怎么才能折出来呢?

  

  好了...上面究竟怎么折只是娱乐而已。

  分析本质啊,分析本质啊,剥茧抽丝寻找规律啊!

  其实规律很简单...发现在最初网格中相邻的...它们最后一定因为纸的限制在一起咯 [所以单身狗才做不出...]

  但是不同的情侣狗之间却有不同的人生方向

  例如:

  11 12 15 14
  10  9 16 13
   5  8  1  2
   6  7  4  3

  11-12是横向发展的,但是因为要折成一列,所以12-15和它虽然也是横向发展,却要和11-12不同的方向去折。

  11-10是纵向发展的,同理,也有10-5和它方向不同。

  所以总共有四个方向。

  

  我们再分析一下,对于一个中间的节点,就需要折向四个不同的方向。【泄水置平地,各自东西南北流】

  但是两个相同方向的折纸,就不能有相交的元素,例如

  1  3

  2  4

  1-3,2-4是方向完全相同的,但是因为两个相同的折纸一定不能相交。

  

  所以这种状态需要被排除,而如果没有这种状态,是不是就一定可行呢?

  是的,因为除了这种情况外,其他的比如不同向的显然可以,同向包含的也不会出现穿越纸张这种事情了。

  可是有人还是纠结于这个写在纸上,由一个矩形来翻折总觉得不顺手。

  那现在就将你的大脑勾回变成一张矩形白纸,将每一列开始折叠,方向相同的之间不是包含就是相离,感觉还是很好的吧...

  但是列上的,很多可能需要像样例4一样出现塞入这种操作。需要和行操作同时进行,有点难以想象,但是感觉只要符合了条件,进行折叠总是对的。

  感受完毕,代码呈上。

#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; const int maxn=; typedef int array[maxn][maxn];
array map, pam; int t,n,m;
int link[maxn*maxn]; void newarc(int x,int y){
if(x<y)
link[x]=y,link[y]=-;
else
link[y]=x,link[x]=-;
} bool check(int n,int m,array &map,int x){
int i,j,top,stack[maxn*maxn];
memset(link,,sizeof(link)); for(int i=;i<n;i++)
if((i&) == x)
for(int j=;j<=m;j++)
newarc(map[i][j],map[i+][j]); top=;
for(int i=;i<=t;i++){
if(link[i]>)
stack[++top]=link[i];
else if(link[i]<){
if(stack[top]!=i) return false;
top--;
};
}
return true;
} int main(){
freopen("foldgirl.in","r",stdin);
freopen("foldgirl.out","w",stdout); int kase; scanf("%d",&kase);
while(kase--){
scanf("%d%d",&n,&m);
t=n*m;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&map[i][j]),pam[j][i]=map[i][j]; if(check(n,m,map,) && check(n,m,map,) && check(m,n,pam,) && check(m,n,pam,))
puts("AllRight");
else
puts("Cheat");
} return ;
}

TEST ON 平安夜的更多相关文章

  1. [Head First设计模式]一个人的平安夜——单例模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  2. 我的平安夜-Merry Christmas

    我的平安夜-Merry Christmas 平安夜给自己买的第一个"苹果",嘻嘻. 今夜,不想去学习技术知识点什么的, 我们就想到哪里写哪里,就简单聊聊思维方式吧. 其实我不想做今 ...

  3. 旺财速啃H5框架之Bootstrap(二)

    突然感觉不知道写啥子,脑子里面没水了,可能是因为今晚要出去浪,哈哈~~~提前提醒大家平安夜要回家哦,圣诞节生00000000000这么多蛋....继续 上一篇的已经把bootstrap了解个大概了,接 ...

  4. WhatsApp的Erlang世界

    rick 的两个ppt整理 下载:2012 2013  ,使用半年erlang后,重新看这两个ppt才发现更多值的学习的地方,从ppt中整理如下: - Prefer os:timestamp to e ...

  5. The innocence is brilliant.

    [11.20~12.20] 2016年的最后一个月在听Avril的歌,感觉她发音状态好好(对此建议去听<Wish You Were Here>!!!) 到此12月份的活都干完了吧~还剩最后 ...

  6. 带节日和农历的js日历

    带农历的脚本: http://keleyi.com/keleyi/phtml/jstexiao/11.htm http://keleyi.com/tools/rili/ <html> &l ...

  7. H5框架之Bootstrap(二)

    H5框架之Bootstrap(二) 突然感觉不知道写啥子,脑子里面没水了,可能是因为今晚要出去浪,哈哈~~~提前提醒大家平安夜要回家哦,圣诞节生00000000000这么多蛋....继续 上一篇的已经 ...

  8. RabbitMQ 声明Queue时的参数们的Power

    参数们的Power 在声明队列的时候会有很多的参数 public static QueueDeclareOk QueueDeclare(this IModel model, string queue ...

  9. [Head First设计模式]抢票中的设计模式——代理模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

随机推荐

  1. Entity Framework Extended Library (EF扩展类库,支持批量更新、删除、合并多个查询等)

    E文好的可以直接看https://github.com/loresoft/EntityFramework.Extended 也可以在nuget上直接安装这个包 1.先更新VS的NuGet版本http: ...

  2. [leetcode]_Climbing Stairs

    我敢保证这道题是在今早蹲厕所的时候突然冒出的解法.第一次接触DP题,我好伟大啊啊啊~ 题目:一个N阶的梯子,一次能够走1步或者2步,问有多少种走法. 解法:原始DP问题. 思路: 1.if N == ...

  3. IIS 7.5 配置Asp+Access的几点注意的地方

    环境:window2008 R2 + iis 7.51 把网站程序放在一个www文件夹里面,给这个文件夹添加everyone的用户,赋予全部读写权限,这样安全些.2 选中要配置的网站,点击页面中间“A ...

  4. MongoDb 与 Nodejs服务器的启动

    1) 启动MongoDB : MongoDB —dbpath databaseNameFolder. 2) 启动数据库 : Mongo DatabaseName. 3) 启动NodeJs: Node ...

  5. .Net并行编程

    1.什么是线程?线程和进程的区别是什么? 线程是程序执行的最小单元. 区别: 进程是操作系统进行资源处理和分配的最小单位,而一个进程可以包含多个线程,并共享进程的资源. 2.什么是多线程?为什么设计多 ...

  6. STM32F4_TIM输入波形捕获(脉冲频率)

    Ⅰ.概述 本文在前面文章“STM32基本的计数原理”的基础上进行拓展,讲述关于“定时器输入捕获”的功能,和上一篇文章“定时器比较输出”区别还是挺大的.在引脚上刚好相反:一个输入.一个输出. 本文只使用 ...

  7. sqlserver中查找长时间未提交事务

    无论是有意无意,如果事务在数据库中保持打开,则它会阻塞其他进程对修改后的数据进行操作.同样,对事务日志进行备份也只会截断不活动事务的那部分事务日志,所以打开的事务会导致日志变多(甚至达到物理限制),直 ...

  8. Oracle redo 日志切换时间频率

    DB: 11.2.0.3.0 查看Oracle的redo日志切换频率 两条SQL,原理是一样的,第二个用到了统计函数 时间单位:分钟 方法一. select * from v$log a where ...

  9. 微软云平台媒体服务实践系列 1- 使用静态封装为iOS, Android 设备实现点播(VoD)方案

    微软的云平台媒体服务为流媒体服务提供了多种选择,在使用流媒体服务为企业做流媒体方案时,首先需要确认要流媒体接收目标,如针对广大iOS, Android移动设备,由于它们都支持HLS 格式的流媒体,基于 ...

  10. require.js的用法

    我采用的是一个非常流行的库require.js. 一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码越来越多,一个文 ...