【JZOJ4833】【NOIP2016提高A组集训第3场10.31】Mahjong
题目描述
解法
搜索。
代码
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
const char* fin="mahjong.in";
const char* fout="mahjong.out";
const int inf=0x7fffffff;
const int maxn=33,maxa=13;
int i,j,k,l,n,tmp,ans=0,ans1=0,ans2=0;
char s[2];
struct mj{
char d[2];
int cnt,id;
}a[maxn];
int b[256][maxa],r[256][maxa];
int use,times;
int num=0;
char f[14][2];
bool cmp(mj a,mj b){
return a.d[0]<b.d[0] || a.d[0]==b.d[0] && a.d[1]<b.d[1];
}
int next(int v){;
k=v+1;
while (k<n && !a[k].cnt) k++;
return k;
}
void dfs(int v,int want){
int i,j,k;
bool bz=false;
if (v==n){
if (!use || b[use][times]>=tmp){
ans+=tmp;
b[use][times]-=tmp;
}
return;
}
if (a[v].cnt==0) {
dfs(next(v),want);
return ;
}
if (next(v)==-1) return;
j=next(v);
k=next(next(v));
if (a[j].d[0]==a[v].d[0] && a[j].d[1]==a[v].d[1]+1){
if (a[k].d[0]==a[v].d[0] && a[k].d[1]==a[v].d[1]+2) {
a[v].cnt--;
a[j].cnt--;
a[k].cnt--;
dfs(v,want);
a[v].cnt++;
a[j].cnt++;
a[k].cnt++;
}
if (bz) return;
if (want==0){
if (a[v].d[1]>'1' && want==0){
a[v].cnt--;
a[j].cnt--;
tmp=b[a[v].d[0]][a[v].d[1]-1-'0'];
use=a[v].d[0];
times=a[v].d[1]-1-'0';
dfs(v,1);
tmp=0;
a[v].cnt++;
a[j].cnt++;
}
if (bz) return;
if (a[j].d[1]<'9' && want==0){
a[v].cnt--;
a[j].cnt--;
tmp=b[a[j].d[0]][a[j].d[1]+1-'0'];
use=a[v].d[0];
times=a[v].d[1]+1-'0';
dfs(v,1);
tmp=0;
a[v].cnt++;
a[j].cnt++;
}
if (bz) return;
}
}
if (a[j].d[0]==a[v].d[0] && a[j].d[1]==a[v].d[1]+2){
if (want==0){
a[v].cnt--;
a[j].cnt--;
tmp=b[a[j].d[0]][a[j].d[1]-1-'0'];
use=a[v].d[0];
times=a[j].d[1]-1-'0';
dfs(v,1);
tmp=0;
a[v].cnt++;
a[j].cnt++;
}
}
if (bz) return;
if (a[k].d[0]==a[v].d[0] && a[k].d[1]==a[v].d[1]+2){
if (want==0){
a[v].cnt--;
a[k].cnt--;
tmp=b[a[k].d[0]][a[k].d[1]-1-'0'];
use=a[v].d[0];
times=a[k].d[1]-1-'0';
dfs(v,1);
tmp=0;
a[v].cnt++;
a[k].cnt++;
}
}
if (a[v].cnt==2 && want==0){
a[v].cnt-=2;
tmp=b[a[v].d[0]][a[v].d[1]-'0'];
use=a[v].d[0];
times=a[v].d[1]-'0';
dfs(v,1);
tmp=0;
a[v].cnt+=2;
}
if (bz) return;
if (a[v].cnt>=3){
a[v].cnt-=3;
int rans=ans;
dfs(v,want);
//if (rans<ans) bz=true;
a[v].cnt+=3;
}
if (bz) return;
}
int main(){
freopen(fin,"r",stdin);
freopen(fout,"w",stdout);
n=0;
for (i=0;i<256;i++) for (j=0;j<maxa;j++) b[i][j]=4;
for (i=0;i<14;i++){
scanf("%s",&s);
if (s[1]=='w') b['w'][s[0]-'0']--;
else if (s[1]=='p') b['p'][s[0]-'0']--;
else b['s'][s[0]-'0']--;
swap(s[0],s[1]);
for (j=0;j<n;j++) if (s[0]==a[j].d[0] && s[1]==a[j].d[1]){
a[j].cnt++;
break;
}
if (j==n) {
a[n].id=i;
a[n].cnt=1;
a[n].d[0]=s[0];
a[n++].d[1]=s[1];
}
}
sort(a,a+n,cmp);
a[n].d[0]='0';
a[n].d[1]='0';
a[n].cnt=0;
for (i=0;i<256;i++) for (j=0;j<maxa;j++) r[i][j]=b[i][j];
for (j=0;j<n;j++){
ans=0;
for (k=0;k<256;k++) for (l=0;l<maxa;l++) b[k][l]=r[k][l];
if (a[j].cnt){
a[j].cnt--;
for (i=0;i<n;i++){
if (a[i].cnt>1){
a[i].cnt-=2;
tmp=0;
use=0;
times=0;
dfs(0,0);
a[i].cnt+=2;
}
if (a[i].cnt%3==1){
a[i].cnt-=1;
tmp=b[a[i].d[0]][a[i].d[1]-'0'];
use=a[i].d[0];
times=a[i].d[1]-'0';
dfs(0,1);
a[i].cnt+=1;
}
}
a[j].cnt++;
}
if (ans>ans2 || ans==ans2 && a[j].id<ans1){
ans1=a[j].id;
ans2=ans;
}
}
ans1++;
printf("%d %d",ans1,ans2);
return 0;
}
启发
耗时间的压轴题;
但NOIP喜欢考。
总结两点来优化程序复杂度;
1.首先要把题目所给的信息数据化,并用数据结构存储;
这里所说的数据结构并非高级数据结构,而是类似于桶、链表之类的,有助于搜索编程复杂度优化的合适的数据结构。
2.明确题目所求:在搜索的时候始终贯彻这个目的。
【JZOJ4833】【NOIP2016提高A组集训第3场10.31】Mahjong的更多相关文章
- 【NOIP2016提高A组集训第3场10.31】高维宇宙
题解 分析 因为只有奇数和偶数配对才有可能得出质数, 暴力求出每一对\(a_i+a_j\)为质数,将其中的奇数想偶数连一条边. 二分图匹配,匈牙利算法. #include <cmath> ...
- 【JZOJ4831】【NOIP2016提高A组集训第3场10.31】方程式
题目描述 数据范围 解法 枚举根之后,使用大除法. 代码 #include<stdio.h> #include<iostream> #include<string.h&g ...
- 【JZOJ4832】【NOIP2016提高A组集训第3场10.31】高维宇宙
题目描述 数据范围 解法 由于大于4的素数只有可能由奇数和偶数的和得出. 所以根据数的奇偶性可以分出两类数奇数和偶数. 奇数之间不会相互匹配,偶数之间也不会相互匹配. 那么原问题转化为二分图最大匹配. ...
- 【JZOJ4824】【NOIP2016提高A组集训第1场10.29】配对游戏
题目描述 流行的跳棋游戏是在一个有m*n个方格的长方形棋盘上玩的.棋盘起初全部被动物或障碍物占满了.在一个方格中,'X'表示一个障碍物,一个'0'-'9'的个位数字表示一个不同种类的动物,相同的个位数 ...
- 【NOIP2016提高A组集训第1场10.29】配对游戏
题目 流行的跳棋游戏是在一个有mn个方格的长方形棋盘上玩的.棋盘起初全部被动物或障碍物占满了.在一个方格中,'X'表示一个障碍物,一个'0'-'9'的个位数字表示一个不同种类的动物,相同的个位数字表示 ...
- 【NOIP2016提高A组集训第1场10.29】完美标号
题目 给定M个二元组(A_i, B_i),求X_1, ..., X_N满足:对于任意(A_i, B_i),有|X_{A_i} - X_{B_i}| = 1成立. 分析 显然,对于二元组(x,y),X_ ...
- JZOJ 【NOIP2016提高A组集训第16场11.15】兔子
JZOJ [NOIP2016提高A组集训第16场11.15]兔子 题目 Description 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3 ...
- JZOJ 【NOIP2016提高A组集训第16场11.15】SJR的直线
JZOJ [NOIP2016提高A组集训第16场11.15]SJR的直线 题目 Description Input Output Sample Input 6 0 1 0 -5 3 0 -5 -2 2 ...
- 【NOIP2016提高A组集训第4场11.1】平衡的子集
题目 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 分析 如果暴力枚举每个人被分到哪 ...
随机推荐
- SpringCloud是如何运行的?
SpringCloud是基于SpringBoot这一高度自动化的应用开发框架,将各类业界比较知名的.得到过实践反馈的开元服务治理相关的技术框架进行优化整合的框架,是一种开发方式的优化和组合,,是一组框 ...
- redis学习笔记06-主从复制和哨兵机制
1.主从复制 为了保证线上业务的持续运行,防止主节点因宕机而重启数据恢复消耗太长时间,通常会准备一个备用节点,备份主节点的数据,当主节点出问题时立马顶上.这种机制就叫做主从复制.在了解redis的主从 ...
- hbase字典顺序存储
rowkey rowkey是行的主键,而且hbase只能用个rowkey,或者一个rowkey范围即scan来查找数据.所以 rowkey的设计是至关重要的,关系到你应用层的查询效率.我们知 ...
- Hadoop Serialization -- hadoop序列化详解 (2)【Text,BytesWritable,NullWritable】
回顾: 回顾序列化,其实原书的结构很清晰,我截图给出书中的章节结构: 序列化最主要的,最底层的是实现writable接口,wiritable规定读和写的游戏规则 (void write(DataOut ...
- Java 函数优雅之道
导读 随着软件项目代码的日积月累,系统维护成本变得越来越高,是所有软件团队面临的共同问题.持续地优化代码,提高代码的质量,是提升系统生命力的有效手段之一.软件系统思维有句话“Less coding, ...
- windows 2008 安装 apache + mysql + php
下载准备 php : http://windows.php.net/downloads/releases/archives/ apache : https://www.apachehaus.com/c ...
- CesiumLab V1.2 新功能 倾斜数据处理
一转眼又是一周的时间,我们的实验室功能又强大了. 照旧我们先放毒,放图,图,太晚了,字都敲不到一起了 lod以及包围盒 大雁塔实例,按楼层单体化 倾斜数据处理参数设置 简单介绍一下 Ces ...
- 网站被攻击扫描SQL注入的日常记录
我发了个博客,泄露了域名之后,便有人疯狂的尝试攻击我的站点,奈何我防守做得比较好,直接把网段封了,看到403还锲而不舍,我真是想给他颁奖了 查看ua,发现很多sqlmap的ua,肯定会是被刷了,只是运 ...
- message d:\WEB_APP_QuChongFu\file\五月.xlsx (文件名、目录名或卷标语法不正确。)
原因是 文件名或文件夹名中不能出现以下字符:\ / : * ? " < > | 但是后台读取到的附件的文件路径就是这样的 网上大佬说了,这样处理 rep ...
- python 全局种子与局部种子