题意不讲,怕说不清,自己一点点看吧。
思路是贪心,将每个人的牌按从小到大或(从大到小),我是从小到大排的,
然后每次从第二摞排中找比第一摞排的那张大且相差最小的就可以了,每次找到就sum++;
最后sum值就是最优的(贪心思想)。
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 int f(const void*p,const void*q); 8 typedef struct pp 9 { 10 int x; 11 int y; 12 } ss; 13 int main(void) 14 { 15 int n,i,j,k,p,q; 16 char a[100]; 17 char b[100]; 18 ss kk[100]; 19 ss qq[100]; 20 scanf("%d",&k); 21 while(k--) 22 { 23 scanf("%d ",&n); 24 gets(a); 25 gets(b); 26 int uu=0; 27 for(i=0; a[i]!='\0'; i++) 28 { 29 if(i%3==0) 30 { 31 if(a[i]=='T') 32 { 33 kk[uu].x=10; 34 35 } 36 else if(a[i]=='J') 37 { 38 kk[uu].x=11; 39 } 40 else if(a[i]=='Q') 41 { 42 kk[uu].x=12; 43 } 44 else if(a[i]=='K') 45 { 46 kk[uu].x=13; 47 } 48 else if(a[i]=='A') 49 { 50 kk[uu].x=14; 51 } 52 else kk[uu].x=a[i]-'0'; 53 54 } 55 if((i-1)%3==0&&a[i]!='S') 56 { 57 kk[uu].y=a[i]-'A'; 58 uu++; 59 } 60 if((i-1)%3==0&&a[i]=='S') 61 { 62 kk[uu].y=6; 63 uu++; 64 } 65 66 } 67 uu=0; 68 for(i=0; b[i]!='\0'; i++) 69 { 70 if(i%3==0) 71 { 72 if(b[i]=='T') 73 { 74 qq[uu].x=10; 75 76 } 77 else if(b[i]=='J') 78 { 79 qq[uu].x=11; 80 } 81 else if(b[i]=='Q') 82 { 83 qq[uu].x=12; 84 } 85 else if(b[i]=='K') 86 { 87 qq[uu].x=13; 88 } 89 else if(b[i]=='A') 90 { 91 qq[uu].x=14; 92 } 93 else qq[uu].x=b[i]-'0'; 94 95 } 96 if((i-1)%3==0&&b[i]!='S') 97 { 98 qq[uu].y=b[i]-'A'; 99 uu++; 100 } 101 if((i-1)%3==0&&b[i]=='S') 102 { 103 qq[uu].y=6; 104 uu++; 105 } 106 } 107 qsort(qq,n,sizeof(ss),f); 108 qsort(kk,n,sizeof(ss),f); 109 int x,y; 110 x=0; 111 int s=0; 112 for(j=0; j kk[j].x) 117 { 118 x=p+1; 119 s++; 120 break; 121 } 122 else if(qq[p].x==kk[j].x) 123 { 124 if(qq[p].y>kk[j].y) 125 { 126 x=p+1; 127 s++; 128 break; 129 } 130 } 131 } 132 } 133 printf("%d\n",s); 134 135 } 136 return 0; 137 138 } 139 int f(const void*p,const void*q) 140 { 141 ss*w=(ss*)p; 142 ss*ww=(ss*)q; 143 if(w->x==ww->x)//如果前面的大小相同,就按后面的从小到大排 144 { 145 return w->y-ww->y; 146 } 147 else return w->x-ww->x; 148 }