【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个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 分析 如果暴力枚举每个人被分到哪 ...
随机推荐
- IO流17 --- 对象流操作自定义对象 --- 技术搬运工(尚硅谷)
序列化 @Test public void test14() throws IOException { ObjectOutputStream oos = new ObjectOutputStream( ...
- CentOS6.5下源码安装MySQL5.6.35
接上一篇文章使用RPM包安装MySQL,确实很方便.但是安装后却不知道各文件保存在哪个文件夹下!尝试使用源码安装~本文主要参考:CentOS 6.4下编译安装MySQL 5.6.14一.卸载旧版本 . ...
- KOA 学习(八) koa-bodyparser
此控件支持Josn,form,text类型 用法 var Koa = require('koa'); var bodyParser = require('koa-bodyparser'); var a ...
- kafka理论
一.消息队列,简称MQ,message queue 生产者:生存数据写到kafka,持久化到硬盘.对同一个Topic来讲,生产者通常只有‘一个’(可以多并发)数据保存时常可以配置,默认保存七天. 消费 ...
- iOS CALayer之CAEmitterLayer粒子发射器的神奇效果
https://www.jianshu.com/p/c54ffd7412e7 想必以前QQ空间的点赞效果大家都知道吧,点赞之后按钮周围会有一圈爆裂的小圆点:还有微信的红包雨表情动画等,以及烟花,火焰效 ...
- 【转载】传统以太网和时间敏感网络TSN的区别
转载连接:http://www.proav-china.com/News/16800.html ——Biamp亚太区高级工程师 Kane Zhang [专业视听网报道]:[摘要]AVB-Audio ...
- c++新特性实验(5)声明与定义:属性列表(C++11 起)
1.初识属性 1.1 实验A: noreturn 属性 [[ noreturn ]] static void thread1(void *data){ cout << "nore ...
- JS---案例:无刷新评论---属于创建对象的案例拿出来复习
案例:无刷新评论---属于创建对象的案例拿出来复习 创建行和单元格,添加到相应元素中,设置内容 createElement, appendChild,innerHTML <!DOCTYPE ht ...
- 配置 CentOS 7 的网络,及重命名网卡名
Centos 安装时应配置网络,如果当时没配置好,则装完系统后, 也可通过修改配置文件并重启网络服务进行配置. 说明:CentOS 7.0默认安装好之后是没有自动开启网络连接的! cd /etc/sy ...
- OpenLayers修改要素
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...