Question A: Whether it is better to use all c, all d, or both is the least problematic. Pay attention to the special judgment when n * m <= k
Question B: Meaning of the question It's a trap. Just open a vis array to record the number of previous submissions for each person. If there is a contradiction, false k connections are enough
Question D: Press DP like this, sort by k, and then the dp array only needs to record the complete set, use the rolling array to optimize the space, and then add k * d each time to get the minimum value.
Question E: Construct the problem, but it seems easier to use a random algorithm. The constructed matrix should be
a a a a b
a a a a a b
a a a a a b
c c c c c d
Like this, then just randomize a, b , c, d to determine whether the sum of each row and column is a perfect square number
Code:
A:
B:
#include <stdio.h>#include <string.h>#include <math.h>2 #define min(a,b) ((a)<(b)?(a):(b))int c, d, n, m, k;int main() { scanf("%d%d%d%d%d", &c, &d, &n, &m, &k); int sb = n * m - k; if (sb <= 0) printf("0\n"); else printf("%d\n", min(sb * d, min((int)ceil(sb * 1.0 / n) * c, sb / n * c + sb % n * d))); return 0;}
C:
#include <stdio.h>#include <string.h>const int N = 100005;int n, vis[N];struct Solu { int x, k;} s[N];bool judge() { memset(vis, 0, sizeof(vis)); for (int i = 0; i < n; i++) { int x = s[i].x, k = s[i].k; if (x == vis[k]) vis[k]++; else if (x > vis[k]) return false; } return true;}int main() { scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d%d", &s[i].x, &s[i].k); if (judge()) printf("YES\n"); else printf("NO\n"); return 0;}
D:
#include <stdio.h>#include <string.h>int n, k;int main() { scanf("%d%d", &n, &k); if ((n - k) <= k) printf("-1\n"); else { printf("%d\n", n * k); for (int i = 1; i <= n; i++) { for (int j = 1; j <= k; j++) { int a = i, b = i + j; if (b > n) b -= n; printf("%d %d\n", a, b); } } } return 0;}<br> </p> <p></p> <p> </p> E: <pre name="code" class="sycode">#include <stdio.h>#include <string.h>#include <algorithm>#define min(a,b) ((a)<(b)?(a):(b))using namespace std;__int64 one = 1;const int N = 105;const int M = (1<<20) + 5;const __int64 INF = (one<<62);__int64 b, dp[M];int i, j, n, m;struct F { __int64 x, k, s;} f[N];bool cmp(F a, F b) { return a.k < b.k;}int main() { __int64 ans = INF; scanf("%d%d%I64d", &n, &m, &b); for (i = 1; i <= n; i++) { int num, ss; scanf("%I64d%I64d%d", &f[i].x, &f[i].k, &num); while (num--) { scanf("%d", &ss); f[i].s |= (1<<(ss-1)); } } int smax = (1<<m); sort(f + 1, f + n + 1, cmp); for (i = 1; i < smax; i++) dp[i] = INF; for (i = 1; i <= n; i++) { for (j = 0; j < smax; j++) { int ss = (j|f[i].s); dp[ss] = min(dp[ss], dp[j] + f[i].x); } ans = min(ans, dp[smax - 1] + f[i].k * b); } if (ans == INF) ans = -1; printf("%I64d\n", ans); return 0;}
#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>int n, m;bool check(int num) { int m = (int)sqrt(num); return m * m == num;}int main() { scanf("%d%d", &n, &m); int a, b, c, d, i, j; while (1) { a = rand() % 100 + 1; b = rand() % 100 + 1; c = rand() % 100 + 1; d = rand() % 100 + 1; if (check((m - 1) * a * a + b * b) && check((m - 1) * c * c + d * d) && check((n - 1) * a * a + c * c) && check((n - 1) * b * b + d * d)) break; } for (i = 0; i < n - 1; i++) { for (j = 0; j < m - 1; j++) printf("%d ", a); printf("%d\n", b); } for (j = 0; j < m - 1; j++) printf("%d ", c); printf("%d\n", d); return 0;}