1. 程式人生 > >[noip2015]鬥地主

[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<