2018年浙江中醫藥大學程式設計競賽 L Wpremig's Niuniu
阿新 • • 發佈:2018-12-23
題意:
規則:
五張牌均嚴格小於5,五張牌的和小於等於10,得60分。
五張牌都是$J,Q,K$,得50分。
五張牌有四張牌相同,得40分。
如果其中三張牌的和是10的倍數,並且其他兩張牌的和是10的倍數,得30分
如果其中三張牌的和是10的倍數,並且其他兩張牌的和對於10的餘數大於等於7,得$2*$其他兩張牌的和對於10的餘數
如果其中三張牌的和是10的倍數,並且其他兩張牌的和對於10的餘數大於等於7,得其他兩張牌的和對於10的餘數
其餘情況不得分,同時每次只能獲取最高分。
現在你手上已經有四張牌,求拿到第五張牌後的分數期望(四捨五入)
思路:
預處理出所有情況,最後遍歷一次得到總分後除以13
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll MOD = 1e9 + 7; int ans[20][20][20][20][20]; void Init() { for (int a = 1; a <= 13; ++a) { for (int b = 1; b <= 13; ++b) { for (int c = 1; c <= 13; ++c) {View Codefor (int d = 1; d <= 13; ++d) { for (int e = 1; e <= 13; ++e) { if (a < 5 && b < 5 && c < 5 && d < 5 && e < 5 && a + b + c + d + e <= 10) { ans[a][b][c][d][e]= 60; } else if (a >= 11 && b >= 11 && c >= 11 && d >= 11 && e >= 11) { ans[a][b][c][d][e] = 50; } else if ((a == b && b == c && c == d) || (a == b && b == c && c == e) || (a == b && b == d && d == e) || (a == c && c == d && d == e) || (b == c && c == d && d == e)) { ans[a][b][c][d][e] = 40; } else { if ((min(10, a) + min(10, b) + min(10, c)) % 10 == 0 || (min(10, a) + min(10, b) + min(10, d)) % 10 == 0 || (min(10, a) + min(10, b) + min(10, e)) % 10 == 0 || (min(10, a) + min(10, c) + min(10, d)) % 10 == 0 || (min(10, a) + min(10, c) + min(10, e)) % 10 == 0 || (min(10, a) + min(10, d) + min(10, e)) % 10 == 0 || (min(10, b) + min(10, c) + min(10, d)) % 10 == 0 || (min(10, b) + min(10, c) + min(10, e)) % 10 == 0 || (min(10, b) + min(10, d) + min(10, e)) % 10 == 0 || (min(10, b) + min(10, d) + min(10, e)) % 10 == 0 || (min(10, c) + min(10, d) + min(10, e)) % 10 == 0) { int sum = min(10, a) + min(10, b) + min(10, c) + min(10, d) + min(10, e); if (sum % 10 == 0) ans[a][b][c][d][e] = 30; else if (sum % 10 >= 7) ans[a][b][c][d][e] = 2 * (sum % 10); else ans[a][b][c][d][e] = sum % 10; } } } } } } } } void RUN() { Init(); int t; scanf("%d", &t); while (t--) { int a, b, c, d; scanf("%d %d %d %d", &a, &b, &c, &d); int sum = 0; for (int i = 1; i <= 13; ++i) sum += ans[a][b][c][d][i]; sum = (sum / 13.0) + 0.5; printf("%d\n", sum); } } int main() { #ifdef LOCAL_JUDGE freopen("Text.txt", "r", stdin); #endif // LOCAL_JUDGE RUN(); #ifdef LOCAL_JUDGE fclose(stdin); #endif // LOCAL_JUDGE return 0; }
列舉最後一張牌,求總分,最後除以13
#include<bits/stdc++.h> using namespace std; int a[10], b[10]; int c[15]; void RUN() { int t; scanf("%d", &t); while (t--) { for (int i = 1; i <= 4; ++i) scanf("%d", a + i); b[1] = min(10, a[1]) + min(10, a[2]); b[2] = min(10, a[1]) + min(10, a[3]); b[3] = min(10, a[1]) + min(10, a[4]); b[4] = min(10, a[2]) + min(10, a[3]); b[5] = min(10, a[2]) + min(10, a[4]); b[6] = min(10, a[3]) + min(10, a[4]); b[7] = 0; int tmp = 0; for (int i = 1; i <= 4; ++i) tmp += min(10, a[i]); for (int i = 1; i <= 4; ++i) { if ((tmp - min(10, a[i])) % 10 == 0) { b[7] = 1; break; } } double ans = 0; for (int i = 1; i <= 13; ++i) { a[5] = i; //1 if (a[1] < 5 && a[2] < 5 && a[3] < 5 && a[4] < 5 && a[5] < 5 && a[1] + a[2] + a[3] + a[4] + a[5] <= 10) { ans += 60.0; continue; } //2 if (a[1] >= 11 && a[2] >= 11 && a[3] >= 11 && a[4] >= 11 && a[5] >= 11) { ans += 50.0; continue; } //3 if ((a[1] == a[2] && a[2] == a[3] && a[3] == a[4]) || (a[1] == a[2] && a[2] == a[3] && a[3] == a[5]) || (a[1] == a[2] && a[2] == a[4] && a[4] == a[5]) || (a[1] == a[3] && a[3] == a[4] && a[4] == a[5]) || (a[2] == a[3] && a[3] == a[4] && a[4] == a[5])) { ans += 40.0; continue; } //4 int sum = 0; for (int i = 1; i <= 5; ++i) sum += min(10, a[i]); if (b[7]) { if (sum % 10 == 0) ans += 30.0; else if (sum % 10 >= 7) ans += 2.0 * (sum % 10); else ans += sum % 10; continue; } //5 int res = -1; for (int j = 1; j <= 6; ++j) { if ((b[j] + min(10, a[5])) % 10 == 0) { res = sum % 10; break; } } if (res == -1) continue; if (res == 0) ans += 30.0; else if (res >= 7) ans += 2.0 * res; else if (res != -1) ans += res; } ans = (ans / 13.0) + 0.5; printf("%d\n", (int)ans); } } int main() { #ifdef LOCAL_JUDGE freopen("Text.txt", "r", stdin); #endif // LOCAL_JUDGE RUN(); #ifdef LOCAL_JUDGE fclose(stdin); #endif // LOCAL_JUDGE return 0; }View Code
比賽的時候寫醜了,同時對於題意理解不明確?(說好的一副牌呢!)