A - Dogs and Cagesnode
水。c++
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int t; 5 double n; 6 7 int main() 8 { 9 scanf("%d", &t); 10 for (int kase = 1; kase <= t; ++kase) 11 { 12 scanf("%lf", &n); 13 printf("Case #%d: %.10f\n", kase, n - 1); 14 } 15 return 0; 16 }
B - Same Digitgit
留坑。ide
C - Rich Gameui
題意:有兩我的,A能夠控制輸贏,可是沒有錢,B有無限的錢,他們打羽毛球,至少要得到11個點而且要比對方至少多得到兩個點才能贏下當局,若是A 贏了 一個點,A要給B Y元,不然 B 給A X 元 求他們一共打K局的狀況下,A最多能夠贏多少局spa
思路:顯然,當x > y 的時候 能夠贏k局rest
考慮 x <= y 的狀況 根據貪心的思路,假設A 要輸 t 局code
那麼 必然要知足 $11yt >= (k - t)(11y - 9x)$htm
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int t, x, y, k; 5 6 int main() 7 { 8 scanf("%d", &t); 9 for (int kase = 1; kase <= t; ++kase) 10 { 11 printf("Case #%d: ", kase); 12 scanf("%d%d%d", &x, &y, &k); 13 if (x > y) printf("%d\n", k); 14 else 15 { 16 int t = (int)ceil(k * (11 * y - 9 * x) * 1.0 / (11 * y + 2 * x)); 17 printf("%d\n", k - t); 18 } 19 } 20 return 0; 21 }
D - Mr. Panda and Circlesblog
留坑。
E - Evil Forest
水。
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define N 1010 5 6 int t, n, sum, num; 7 8 int main() 9 { 10 scanf("%d", &t); 11 for (int kase = 1; kase <= t; ++kase) 12 { 13 scanf("%d", &n); sum = 0; 14 for (int i = 1; i <= n; ++i) 15 { 16 scanf("%d", &num); 17 sum += num; 18 sum += (num % 10) ? (num / 10) + 1 : (num / 10); 19 } 20 printf("Case #%d: %d\n", kase, sum); 21 } 22 return 0; 23 }
F - Fair Lottery
留坑。
G - Alice’s Stamps
題意:給出M個區間,選擇K個區間,使得選擇的元素儘可能多,區間能夠交叉
思路:$dp[i][j]$ 表示 第i位,選擇k個區間的時候,數量最可能是多少
三個狀態轉移
$dp[i + 1][j] = max(dp[i][j], dp[i + 1][j])$
$dp[i][j +1] = max(dp[i][j], dp[i][j + 1])$
$dp[i + cnt][j + 1] = max(dp[i + cnt][j], dp[i][j] + cnt)$
cnt 爲 那個區間最長能到哪裏
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 #define N 2010 6 7 int dp[N][N]; 8 9 struct node{ 10 int l, r; 11 inline node(){} 12 inline node(int l, int r) :l(l), r(r){} 13 inline bool operator < (const node &b) const 14 { 15 return l == b.l ? r > b.r : l < b.l; 16 } 17 }arr[N]; 18 19 int n, m, k; 20 int cnt, val; 21 22 int main() 23 { 24 int t; 25 scanf("%d",&t); 26 for(int cas = 1; cas <= t; ++cas) 27 { 28 scanf("%d %d %d" , &n, &m, &k); 29 for(int i = 1; i <= m; ++i) 30 { 31 scanf("%d %d", &arr[i].l, &arr[i].r); 32 } 33 sort(arr + 1, arr + 1 + m); 34 memset(dp, 0, sizeof dp); 35 val = 0; 36 cnt = 1; 37 for(int i = 0; i < n; ++i) 38 { 39 while(cnt <= m && arr[cnt].l == i + 1) 40 { 41 val = max(val, arr[cnt].r - arr[cnt].l + 1); 42 cnt++; 43 } 44 for(int j = 0; j <= k; ++j) 45 { 46 dp[i + 1][j] = max(dp[i + 1][j], dp[i][j]); 47 dp[i][j + 1] = max(dp[i][j], dp[i][j + 1]); 48 dp[i + val][j + 1] = max(dp[i + val][j + 1], dp[i][j] + val); 49 } 50 if(val) --val; 51 } 52 printf("Case #%d: %d\n", cas, dp[n][k]); 53 } 54 return 0; 55 }
H - Equidistance
留坑。
I - Inkopolis
留坑。
J - Subway Chasing
留坑。
K - Knightmare
題意:在無限大的棋盤上,馬走日,有多少個點是可以走到的
思路:BFS找規律,二階差分
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define ull unsigned long long 5 6 int arr[] = {1, 9, 41, 109, 205, 325, 473}; 7 8 int t; 9 ull n; 10 11 int main() 12 { 13 scanf("%d", &t); 14 for (int kase = 1; kase <= t; ++kase) 15 { 16 printf("Case #%d: ", kase); 17 scanf("%llu", &n); 18 if (n <= 6) printf("%d\n", arr[n]); 19 else 20 { 21 ull sum = 473; n -= 6; 22 sum += (ull)148 * n + (ull)14 * n * (n + 1); 23 printf("%llu\n", sum); 24 } 25 } 26 return 0; 27 }