zoukankan      html  css  js  c++  java
  • asd

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    using namespace std;
    
    const int N = 30;
    
    int T, n;
    int a[N];
    int ans;
    
    void dfs(int now) {
    	if(now >= ans) return;
    	int cnt = 0;
    	for(int i = 3; i <= 14; ++i) { //单顺子
    		if(a[i] == 0)/*<1*/ cnt = 0;
    		else {
    			cnt++;
    			if(cnt >= 5) {
    				for(int j = i; j >= i - cnt + 1; --j) a[j]--;
    				dfs(now + 1);
    				for(int j = i; j >= i - cnt + 1; --j) a[j]++;
    			}
    		}
    	}
    	cnt = 0;
    	for(int i = 3; i <= 14; ++i) { //双顺子
    		if(a[i] <= 1) cnt = 0;
    		else {
    			cnt++;
    			if(cnt >= 3) {
    				for(int j = i; j >= i - cnt + 1; --j) a[j] -= 2;
    				dfs(now + 1);
    				for(int j = i; j >= i - cnt + 1; --j) a[j] += 2;
    			}
    		}
    	}
    	cnt = 0;
    	for(int i = 3; i <= 14; ++i) { //三顺子
    		if(a[i] <= 2) cnt = 0;
    		else {
    			cnt++;
    			if(cnt >= 2) {
    				for(int j = i; j >= i  - cnt + 1; --j) a[j] -= 3;
    				dfs(now + 1);
    				for(int j = i; j >= i  - cnt + 1; --j) a[j] += 3;
    			}
    		}
    	}
    	for(int i = 2; i <= 14; ++i) {
    		if(a[i] <= 3) {
    			if(a[i] <= 2) continue;
    
    			a[i] -= 3;
    			for(int j = 2; j <= 15; ++j) {
    				if(a[j] <= 0 || j == i) continue;
    				a[j]--;
    				dfs(now + 1);
    				a[j]++;
    			}
    
    			for(int j = 2; j <= 14; ++j) {
    				if(a[j] <= 1 || j == i) continue;
    				a[j] -= 2;
    				dfs(now + 1);
    				a[j] += 2;
    			}
    			a[i] += 3;
    		} else {
    			a[i] -= 3;
    			for(int j = 2; j <= 15; ++j) {
    				if(a[j] < 1 || j == i) continue;
    				a[j]--;
    				dfs(now + 1);
    				a[j]++;
    			}
    
    			for(int j = 2; j <= 14; ++j) {
    				if(a[j] < 2 || j == i) continue;
    				a[j] -= 2;
    				dfs(now + 1);
    				a[j] += 2;
    			}
    			a[i] += 3;
    
    			a[i] -= 4;
    			for(int j = 2; j <= 15; ++j) {
    				if(a[j] <= 0 || j == i) continue;
    				a[j]--;
    				for(int k = 2; k <= 15; ++k) {
    					if(a[k] <= 0) continue;
    					a[k]--;
    					dfs(now + 1);
    					a[k]++;
    				}
    				a[j]++;
    			}
    
    			for(int j = 2; j <= 14; ++j) {
    				if(a[j] <= 1 || j == i) continue;
    				a[j] -= 2;
    				for(int k = 2; k <= 14; ++k) {
    					if(a[k] <= 1) continue;
    					a[k] -= 2;
    					dfs(now + 1);
    					a[k] += 2;
    				}
    				a[j] += 2;
    			}
    			a[i] += 4;
    		}
    	}
    	for(int i = 2; i <= 15; ++i) if(a[i]) now++;
    	ans = min(ans, now);
    	return;
    }
    
    int main() {
    	//freopen("a.in", "r", stdin);
    	scanf("%d%d", &T, &n);
    	while(T--) {
    		ans = 0x7fffffff;
    		memset(a, 0, sizeof(a));
    		int x, y;
    		for(int i = 1; i <= n; ++i) {
    			scanf("%d%d", &x, &y);
    			if(x == 0) a[15]++;
    			else if(x == 1) a[14]++;
    			else a[x]++;
    		}
    		dfs(0);
    		cout << ans << '
    ';
    	}
    	return 0;
    }
    
    
  • 相关阅读:
    异常处理
    面向对象 -- 内置方法
    面向对象 -- 反射(详细)
    面向对象 -- 反射
    面向对象 -- 三大特性之封装
    pickle模块 collections模块在面向对象中的应用
    面向对象 -- 三大特性之多态
    Third Week(补充完整)
    Second Week(补充完整)
    First Week (补充完整)
  • 原文地址:https://www.cnblogs.com/Asmallwave/p/11569341.html
Copyright © 2011-2022 走看看