[noip2015]鬥地主
//毒瘤題
//整整一下午才調好
暴力列舉,除了這個沒有別的什麼辦法
可以用hash來剪枝
hash儲存每種狀態的最小值
雖然敲起來很心累,但收穫還是不少的
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
#define ll long long
#define de cout<<1;
const int maxn = 40;
int T,n;
int a[maxn];
map<ll, int>q;
int read() {
int x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9') {
if(ch == '-') f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9') {
x = (x << 1) + (x << 3) + ch - '0';
ch = getchar();
}
return x * f;
}
ll haha() {
ll sum = 0;
for(int i = 3; i <= 16; i++) {
sum = sum * 6 + a[i];
}
return sum;
}
int work() {
int zp = haha();
if(zp == 0) return 0;
if(q.count(zp)) return q[zp];
int sum = 60;
int flag = 0;
//3 shun
for(int i = 3; i <= 13; i++) {
if(a[i] >= 3 && a[i + 1 ] >= 3) {
a[i] -= 3, a[i + 1] -= 3;
flag = 1;
sum = min(work() + 1,sum);
int j;
for(j = i + 2; j <= 14; j++) {
if(a[j] < 3) break;
a[j] -= 3;
sum = min(work() + 1, sum);
}
for(int k = i; k < j; k++) {
a[k] += 3;
}
}
}
//2 shun
for(int i = 3; i <= 12; i++) {
if(a[i] >= 2 && a[i + 1] >= 2 && a[i + 2] >= 2) {
a[i] -= 2, a[i + 1] -= 2, a[i + 2] -= 2;
flag = 1;
sum = min(work() + 1,sum);
int j;
for(j = i + 3; j <= 14; j++) {
if(a[j] < 2) break;
a[j] -= 2;
sum = min(work() + 1, sum);
}
for(int k = i; k < j; k++) {
a[k] += 2;
}
}
}
//1 shun
for(int i = 3; i <= 10; i++) {
if(a[i] >= 1 && a[i + 1] >= 1 && a[i + 2] >= 1 && a[i + 3] >= 1 && a[i + 4] >= 1) {
a[i] -= 1, a[i + 1] -= 1, a[i + 2] -= 1,a[i + 3] -= 1 , a[i + 4] -= 1;
flag = 1;
sum = min(work() + 1,sum);
int j;
for(j = i + 5; j <= 14; j++) {
if(a[j] < 1) break;
a[j] -= 1;
sum = min(work() + 1, sum);
}
for(int k = i; k < j; k++) {
a[k] += 1;
}
}
}
//4 + 2
for(int i = 3; i < 16; i++) {
if(a[i] == 4) {
a[i] -= 4;
flag = 1;
sum = min(sum, work() + 1);
for(int j = 3; j < 16; j++) {//dui
if(a[j] >= 2) {
a[j] -= 2;
for(int k = 3; k < 16; k++) {
if(a[k] >= 2) {
a[k] -= 2;
sum = min(sum, work() + 1);
a[k] += 2;
}
}
a[j] += 2;
}
}
for(int j = 3; j <= 16; j++) {//dan
if(a[j] >= 1) {
a[j] -= 1;
for(int k = 3; k <= 16; k++) {
if(a[k] >= 1) {
a[k] -= 1;
sum = min(sum, work() + 1);
a[k] += 1;
}
}
a[j] += 1;
}
}
a[i] += 4;
}
}
//3 + 1
for(int i = 3; i < 16; i++) {
if(a[i] >= 3) {
a[i] -= 3;
flag = 1;
sum = min(sum, work() + 1);
for(int j = 3; j <= 16; j++) {//dui
if(a[j] >= 2) {
a[j] -= 2;
sum = min(sum, work() + 1);
a[j] += 2;
}
}
for(int j = 3; j <= 16; j++) {//dan
if(a[j] >= 1) {
a[j] -= 1;
sum = min(sum, work() + 1);
a[j] += 1;
}
}
a[i] += 3;
}
}
//dui
for(int i = 3; i <= 16; i++) {
if(a[i] >= 2) {
a[i] -= 2;
flag = 1;
sum = min(sum, work() + 1);
a[i] += 2;
}
}
//dan
if(!flag){
sum = 0;
for(int i = 3; i <= 16; i++) {
sum += a[i];
}
}
q[zp] = sum;
return sum;
}
int main() {
T = read(), n = read();
while(T--) {
memset(a,0,sizeof(a));
for(int i = 1; i <= n; i++) {
int p = read(), q = read();
if(p == 0) a[16]++;
else if(p == 1) a[14]++;
else if(p == 2) a[15]++;
else a[p]++;
}
printf("%d\n",work());
}
return 0;
}
相關推薦
NOIP2015 鬥地主
str 數據 tin 思路 == 1+n logs b- n) 題目描述牛牛最近迷上了一種叫鬥地主的撲克遊戲。鬥地主是一種使用黑桃、紅心、梅花、方片的A 到K 加上大小王的共54 張牌來進行的撲克牌遊戲。在鬥地主中,牌的大小關系根據牌的數碼表示如下:3<4<5&
BZOJ-4325: NOIP2015 鬥地主 (搜索神題)
std 正整數 line ++i color register noi return ac代碼 4325: NOIP2015 鬥地主 Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 955 Solved: 642[Sub
2018.11.01 bzoj4325: NOIP2015 鬥地主(貪心+搜尋)
傳送門 原來一直以為是一道大模擬。 沒想到是一道搜尋+最優性剪枝 如何搜最優呢? 我們考慮怎麼最快出完。 大概是應該儘量出當前能出出去最多的吧。 於是我們選擇優先出順子。 這樣做有什麼好處呢? 我們會發現除了順子以外的牌都能夠直接算最少需要出幾輪。 因此把順子出完之後更新答案就行了。 於
[noip2015]鬥地主
//毒瘤題 //整整一下午才調好 暴力列舉,除了這個沒有別的什麼辦法 可以用hash來剪枝 hash儲存每種狀態的最小值 雖然敲起來很心累,但收穫還是不少的 #include<iostream> #include<cstdio>
NOIP2015 鬥地主 解題報告(搜尋)
線上評測: http://codevs.cn/problem/4610/ 整體思路: 首先我們明確一件事,如果手裡的牌不打龍的話,那麼通過貪心,最優解是固定的。那麼我們可以只去搜尋龍是怎麼打的,然後取一個總體最有的解就好了。 那麼貪心怎麼貪,顯
bzoj4325: NOIP2015 鬥地主
題目 題解: 題解 #include<bits/stdc++.h> using namespace std; #define X f[i][j][k][l] inline void M(int &x,int y){ if (
【NOIP2015】鬥地主
eof 2個 ios sca desc input inpu 數據 撲克 P2431 - 【NOIP2015】鬥地主 Description 牛牛最近迷上了一種叫鬥地主的撲克遊戲。鬥地主是一種 使用黑桃、紅心、梅花、方片的A到K加上大小王的共54張牌來進行的撲克牌
2018.11.06【NOIP2015】【洛谷P2668】鬥地主(DP預處理)(搜尋)
傳送門 解析: 其實不考慮點數大小的話只有張數對我們是有用的。所以可以預處理出有 i i
【NOIP2015提高組】鬥地主
題目背景 NOIP2015 提高組 Day1 T3 題目描述 牛牛最近迷上了一種叫鬥地主的撲克遊戲。鬥地主是一種使用黑桃、紅心、梅花、方片的A到K加上大小王的共54張牌來進行的撲克牌遊戲。在鬥地主中,牌的大小關係根據牌的數碼錶示如下:3<4<5<
【P2668】鬥地主【NOIP2015】
題目描述 牛牛最近迷上了一種叫鬥地主的撲克遊戲。鬥地主是一種使用黑桃、紅心、梅花、方片的A到K加上大小王的共54張牌來進行的撲克牌遊戲。在鬥地主中,牌的大小關係根據牌的數碼錶示如下:3<4<5<6<7<8<9<10&l
【NOIP2015提高組Day1】鬥地主
簡單,暴力模擬 #include<cstdio> #include<cstring> using namespace std; int a[18],f[18][18][18][18]; int ans; int min(int x,int y){re
P2668 鬥地主
其中 tool -- 正整數 現在 ring left hang == P2668 鬥地主 題目描述 牛牛最近迷上了一種叫鬥地主的撲克遊戲。鬥地主是一種使用黑桃、紅心、梅花、方片的A到K加上大小王的共54張牌來進行的撲克牌遊戲。在鬥地主中
Libgdx: android單機鬥地主支持局域網wifi聯網的網絡模塊核心代碼
ring 本機ip count() trace name out 初始化 current err 這個作品是我近期寫的,結合我的畢業設計的通信模塊和之前的單機版鬥地主。我已經上架到豌豆莢了,貼了點廣告,看看能不能賺點茶錢。但是一點也不樂觀。因此我想分享給大家源代碼。
簡單鬥地主
簡單鬥地主/* * 一副撲克 * 洗牌 * 發牌 *看牌 */ public static void fightLandlord(){ //一副撲克 String[] num={"3","4","5","6","7","8","9","10","J","Q","K","
[NOIP 2016TG D1T3] 鬥地主
color 輸入 pri turn https 測試 撲克牌 .org del 題目描述 牛牛最近迷上了一種叫鬥地主的撲克遊戲。鬥地主是一種使用黑桃、紅心、梅花、方片的A到K加上大小王的共54張牌來進行的撲克牌遊戲。在鬥地主中,牌的大小關系根據牌的數碼表示如下:3<4
luoguP2668 鬥地主 x
com www blank app http 大王 剪枝 mat clu P2668 鬥地主 題目描述 牛牛最近迷上了一種叫鬥地主的撲克遊戲。鬥地主是一種使用黑桃、紅心、梅花、方片的A到K加上大小王的共54張牌來進行的撲克牌遊戲。在鬥地主中,牌的大小關系根據牌的數碼表示
妞一個鬥地主發牌程序!!!
循環 步驟 pan pre length 知識 基本 復制 code 學習java三個星期,利用所學的知識做了一個三人鬥地主發牌程序,閑話少敘,上代碼 1 import java.util.ArrayList; 2 import java.util.Colle
棋牌平臺架設教程之鬥地主核心算法
棋牌 源碼 首先,要弄清楚鬥地主的牌型有哪些。可以參考QQ遊戲給出的介紹,如下: 火箭:即雙王(大王和小王),最大的牌。 炸彈:四張同數值牌(如四個 7 )。 單牌:單個牌(如紅桃 5 )。 對牌:數值相同的兩張牌(如梅花 4+ 方塊 4 )。
棋牌平臺開發教程之鬥地主常用算法
源碼 最大的 http 大王 等待時間 細節 第一個 參考 更多 首先,要弄清楚鬥地主的牌型有哪些。可以參考QQ遊戲給出的介紹,如下: 火箭:即雙王(大王和小王),最大的牌。 炸彈:四張同數值牌(如四個 7 )。 單牌:單個
洛谷 P2668 鬥地主
中間 std == i++ 問題 輸出 ace 撲克牌 大小 題目描述 牛牛最近迷上了一種叫鬥地主的撲克遊戲。鬥地主是一種使用黑桃、紅心、梅花、方片的A到K加上大小王的共54張牌來進行的撲克牌遊戲。在鬥地主中,牌的大小關系根據牌的數碼表示如下:3<4<5<