社区讨论
迷之全T
P2668[NOIP 2015 提高组] 斗地主参与者 7已保存回复 13
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 13 条
- 当前快照
- 1 份
- 快照标识符
- @mi6lu0eg
- 此快照首次捕获于
- 2025/11/20 06:59 4 个月前
- 此快照最后确认于
- 2025/11/20 07:01 4 个月前
CPP
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <ctime>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <map>
#define ll long long
#define SYS sys tem("pause")
using std :: min;
int card[14], ans;
void to_array(int a[], ll x) {
for(int i = 0; i < 14; i++) {
a[i] = x % 10;
x /= 10;
}
}
ll to_num(int a[]) {
ll num = 0, num_ = 1;
for(int i = 0; i < 14; i++, num_ *= 10) {
if(a[i]) num += num_ * a[i];
}
return num;
}
void to_cnt(int a[], ll x) {
memset(a, 0, sizeof(a));
while(x > 0) {
if(x % 10) a[x%10-1] ++;
x /= 10;
}
}
int cal(ll x) {
int a[4], times = 0;
to_cnt(a, x);
while(a[3]) {
a[3]--;
if(a[0] >= 2) a[0] -= 2;
else if(a[1] >= 2) a[1] -= 2;
else if(a[1]) a[1] --;
else if(a[2]) {
if(a[0]) {
a[2] --; a[0] --; a[1] ++;
} else {
a[2] --; a[0] ++;
}
}
else if(a[3]) a[3]--;
times ++;
}
while(a[2]) {
a[2] --;
if(a[0]) a[0] --;
else if(a[1]) a[1] --;
times ++;
}
times += a[0]+a[1];
return times;
}
void dfs(ll x, int cnt) {
int a[14];
to_array(a, x);
for(int k = 1; k <= 3; k++) {
bool flag = 0;
for(int i = 0; i < 12; i++) {
if(a[i] >= k) {
ll num = pow(10, i) * k, num_ = num;
for(int j = i+1; j < 12; j++) {
if(a[j] < k) {
if(j < i+5) {
i = j;
}
break;
} else {
num = num * 10 + num_;
if(j >= i+4) {
dfs(x-num, cnt+1);
flag = true;
}
}
}
}
}
if(!flag) break;
}
ans = min(ans, cnt+cal(x));
}
int main() {
int T, n;
scanf("%d %d", &T, &n);
while(T--) {
memset(card, 0, sizeof(card));
ans = n;
int a, b;
for(int i = 0; i < n; i++) {
scanf("%d %d", &a, &b);
if(a == 0) card[13] ++;
else if(a < 3) card[a+10] ++;
else card[a-3] ++;
}
dfs(to_num(card), 0);
printf("%d\n", ans);
}
return 0;
}
回复
共 13 条回复,欢迎继续交流。
正在加载回复...