31JDJH25D TC4C 5H32H 3H 4H2D 3D 4D Sample Output112題目大意:
給你和你朋友一人n張牌,你知道你朋友的出牌順序,問你怎么安排你的出牌順序才能使你的得分最高,輸出最高得分,兩張牌如果點(diǎn)數(shù)相同則按花色,如果都相同都不得分,具體見題目描述
題目思路:
這題其實(shí)就是田忌賽馬的變形體,可以用貪心做,也可以用二分圖做,這里我用的是二分圖,首先我們考慮怎么建圖,我們知道最后是要你的得分最高,所以如果你的牌的大于他的牌那么你可以連一條邊,你的牌為一個(gè)集合,他的牌為一個(gè)集合,最后的模型就是選取最少的點(diǎn)使得所有邊的至少一個(gè)端點(diǎn)被選中,即最小點(diǎn)覆蓋模型,而最小點(diǎn)覆蓋就是最大匹配,所以我們進(jìn)行最大匹配的答案就是我們要求的
AC代碼:
#include<cstring>#include<cstdio>const int maxn = 30;bool vis[maxn],mp[maxn][maxn];int link[maxn];int com[127];int n;bool dfs(int u){ for(int i=1;i<=n;i++){ if(!vis[i]&&mp[u][i]){ vis[i]=true; if(link[i]==-1||dfs(link[i])){ link[i]=u; return true; } } } return false;}int main(){ com['H'-'1']=4,com['S'-'1']=3,com['D'-'1']=2,com['C'-'1']=1; //預(yù)處理牌的大小 com['1'-'1']=1,com['2'-'1']=2,com['3'-'1']=3,com['4'-'1']=4; com['5'-'1']=5,com['6'-'1']=6,com['7'-'1']=7,com['8'-'1']=8; com['9'-'1']=9,com['T'-'1']=10,com['J'-'1']=11,com['Q'-'1']=12; com['K'-'1']=13,com['A'-'1']=14; int t;scanf("%d",&t); while(t--){ scanf("%d",&n); memset(link,-1,sizeof(link)); memset(mp,false,sizeof(mp)); char str[30][5]; for(int i=1;i<=n;i++){ scanf("%s",str[i]); } for(int i=1;i<=n;i++){ char ch[5]; scanf("%s",ch); for(int j=1;j<=n;j++){ if(com[ch[0]-'1']>com[str[j][0]-'1']||com[ch[0]-'1']==com[str[j][0]-'1']&&com[ch[1]-'1']>com[str[j][1]-'1']) mp[i][j]=true; } } int ans = 0; for(int i=1;i<=n;i++){ memset(vis,false,sizeof(vis)); if(dfs(i))ans++; } printf("%d/n",ans); } return 0;}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注