mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
ff9985fa25
3700-3799
243 lines
4.5 KiB
C++
243 lines
4.5 KiB
C++
#include <cstdio>
|
|
#include <cstring>
|
|
#include <iostream>
|
|
#include <algorithm>
|
|
using namespace std ;
|
|
int num[15] ;
|
|
int b[10] ;
|
|
int temp[10] , cnt = 0;
|
|
int p[10] ;
|
|
int N ;
|
|
int s[10] ;
|
|
int st[10] , ed[10] ;
|
|
char str[10][3] ;
|
|
struct card{
|
|
int a[5] , R;
|
|
void insert(int list[]){
|
|
for (int i = 0 ; i < 5 ; i++)
|
|
b[i] = list[i] ;
|
|
memset(num,0,sizeof(num));
|
|
for (int i = 0 ; i < 5 ; i++)
|
|
num[b[i]]++ ;
|
|
bool flag = 0 ;
|
|
for (int i = 0 ; i < 5 ; i++){
|
|
if (num[b[i]]>1){
|
|
flag=1;
|
|
break ;
|
|
}
|
|
}
|
|
if (flag==0){
|
|
sort(b,b+5) ;
|
|
for (int i = 0 ; i < 5 ; i++) a[i] = b[i] ;
|
|
if (b[0]==2&&b[1]==3)
|
|
if (b[2]==4&&b[3]==5)
|
|
if (b[4]==14){
|
|
b[4] = 1 ;
|
|
sort(b,b+5);
|
|
for (int i = 0 ; i < 5 ; i++)
|
|
a[i] = b[i] ;
|
|
R = 5;
|
|
return ;
|
|
}
|
|
if (b[0]==b[2]-2 && b[1]==b[2]-1)
|
|
if (b[3]==b[2]+1 && b[4]==b[2]+2)
|
|
{
|
|
R = 5 ;
|
|
return ;
|
|
}
|
|
R = 1 ;
|
|
return ;
|
|
}
|
|
int sum2 = 0 , sum3 = 0 , sum4 = 0 ;
|
|
for (int i = 2 ; i < 15 ; i++){
|
|
if (num[i]==2) sum2++ ;
|
|
if (num[i]==3) sum3++ ;
|
|
if (num[i]==4) sum4++ ;
|
|
}
|
|
if (sum4==1){
|
|
int pos ;
|
|
for (int i = 0 ; i < 5 ; i++)
|
|
if (num[b[i]] != 4)
|
|
pos = i ;
|
|
a[0] = b[pos] ;
|
|
R = 7 ;
|
|
if (pos != 0){
|
|
for (int i = 1 ; i < 5 ; i++)
|
|
a[i] = b[0] ;
|
|
return ;
|
|
}
|
|
if (pos != 1){
|
|
for (int i = 1 ; i < 5 ; i++)
|
|
a[i] = b[1];
|
|
return ;
|
|
}
|
|
}
|
|
if (sum2 == 1 && sum3 == 1){
|
|
R = 6 ;
|
|
for (int i = 0 ; i < 5 ; i++){
|
|
if (num[b[i]] == 3){
|
|
for (int j = 2 ; j < 5 ; j++)
|
|
a[j] = b[i] ;
|
|
}else
|
|
{
|
|
for (int j = 0 ; j < 2 ; j++)
|
|
a[j] = b[i] ;
|
|
}
|
|
}
|
|
return ;
|
|
}
|
|
if (sum3 == 1){
|
|
cnt = 0 ; int pos = -1 ;
|
|
for (int i = 0 ; i < 5; i++)
|
|
if (num[b[i]] != 3)
|
|
temp[cnt++] = b[i] ;
|
|
else
|
|
pos = i ;
|
|
for (int i = 2 ; i < 5; i++)
|
|
a[i] = b[pos] ;
|
|
sort(temp,temp+2);
|
|
for (int i = 0 ; i < 2 ; i++)
|
|
a[i] = temp[i] ;
|
|
R = 4 ;
|
|
return ;
|
|
}
|
|
if (sum2 == 1){
|
|
cnt = 0 ; int pos = -1 ;
|
|
for (int i = 0 ; i < 5; i++)
|
|
if (num[b[i]] != 2)
|
|
temp[cnt++] = b[i] ;
|
|
else
|
|
pos = i ;
|
|
for (int i = 3 ; i < 5; i++)
|
|
a[i] = b[pos] ;
|
|
sort(temp,temp+3);
|
|
for (int i = 0 ; i < 3 ; i++)
|
|
a[i] = temp[i] ;
|
|
R = 2 ;
|
|
return ;
|
|
}
|
|
R = 3 ;
|
|
cnt = 0 ; int pos = -1 ;
|
|
for (int i = 0 ; i < 5 ; i++)
|
|
if (num[b[i]] != 1)
|
|
temp[cnt++] = b[i] ;
|
|
else
|
|
pos = i ;
|
|
a[0] = b[pos] ;
|
|
sort(temp,temp+4);
|
|
for (int i = 1 ; i < 5 ; i++)
|
|
a[i] = temp[i-1];
|
|
}
|
|
}state[15*15*15*15*15] ;
|
|
void check(){
|
|
if (p[0]==p[1] && p[0]==p[2])
|
|
if (p[0]==p[3] && p[0]==p[4])
|
|
return ;
|
|
state[++N].insert(p) ;
|
|
}
|
|
void dfs(int i){
|
|
if (i > 4){
|
|
check() ;
|
|
return ;
|
|
}
|
|
for (int j = 2 ; j < 15 ; j++)
|
|
{
|
|
p[i] = j ;
|
|
dfs(i+1) ;
|
|
}
|
|
}
|
|
int get(char c){
|
|
if (c>='0' && c<='9') return c - '0' ;
|
|
if (c=='T') return 10 ;
|
|
if (c=='J') return 11 ;
|
|
if (c=='Q') return 12 ;
|
|
if (c=='K') return 13 ;
|
|
if (c=='A') return 14 ;
|
|
}
|
|
int Cmp(card &A , card &B){
|
|
if (A.R < B.R) return -1 ;
|
|
if (A.R > B.R) return 1 ;
|
|
for (int i = 4 ; i >= 0 ; i--){
|
|
if (A.a[i] < B.a[i])
|
|
return -1 ;
|
|
if (A.a[i] > B.a[i])
|
|
return 1 ;
|
|
}
|
|
return 0 ;
|
|
}
|
|
bool cmp(const card &A , const card &B){
|
|
if (A.R != B.R) return A.R < B.R ;
|
|
for (int i = 4 ; i > 0 ; i--)
|
|
if (A.a[i] != B.a[i])
|
|
return A.a[i] < B.a[i];
|
|
return A.a[0] < B.a[0] ;
|
|
}
|
|
int search(int L,int R,card A){
|
|
int ret ;
|
|
while (L<=R){
|
|
int mid = (L+R)>>1 ;
|
|
if (Cmp(state[mid],A)>=0){
|
|
R = mid - 1 ;
|
|
ret = mid ;
|
|
}else
|
|
L = mid + 1 ;
|
|
}
|
|
return ret ;
|
|
}
|
|
int main(){
|
|
N = 0 ;
|
|
dfs(0) ;
|
|
sort(state+1,state+N+1,cmp);
|
|
int cnt = 1 ;
|
|
for (int i = 2 ; i <= N ; i++){
|
|
if (Cmp(state[i],state[i-1])==0) continue ;
|
|
state[++cnt] = state[i] ;
|
|
}
|
|
N = cnt ; memset(s,0,sizeof(s));
|
|
memset(st,0,sizeof(st));
|
|
for (int i = 1 ; i <= N ; i++){
|
|
s[state[i].R]++ ;
|
|
if (st[state[i].R]==0) st[state[i].R]=i ;
|
|
ed[state[i].R] = i ;
|
|
}
|
|
int Q ;
|
|
scanf("%d",&Q) ;
|
|
int sum[10];
|
|
sum[0] = 0 ;
|
|
for (int i = 1 ; i <= 5 ; i++)
|
|
sum[i] = sum[i-1] + s[i] ;
|
|
while (Q--){
|
|
for (int j = 0 ; j < 5 ; j++)
|
|
scanf("%s",str[j]);
|
|
card now ;
|
|
for (int j = 0 ; j < 5 ; j++)
|
|
b[j] = get(str[j][0]);
|
|
now.insert(b);
|
|
bool samesuit = true ;
|
|
for (int j = 1 ; j < 5 ; j++)
|
|
if (str[j][1] != str[0][1]) samesuit = false ;
|
|
int rank = now.R ;
|
|
int pos = search(st[rank],ed[rank],now) - st[rank] + 1;
|
|
int Tonghua = s[1] ;
|
|
if (!samesuit){
|
|
if (rank <= 5){
|
|
printf("%d\n",sum[rank-1] + pos) ;
|
|
}
|
|
else{
|
|
if (rank == 6)
|
|
printf("%d\n",sum[5] + Tonghua + pos);
|
|
else
|
|
printf("%d\n",sum[5] + Tonghua + s[6] + pos) ;
|
|
}
|
|
}else
|
|
{
|
|
if (rank == 5){
|
|
printf("%d\n",sum[5] + Tonghua + s[6] + s[7] + pos) ;
|
|
}
|
|
else
|
|
printf("%d\n",sum[5] + pos);
|
|
}
|
|
}
|
|
return 0;
|
|
}
|