Edu164
C. Long Multiplication
Problem - C - Codeforces
数论。
思路:两数相乘差小积大。
void solve()
{cin >> s1 >> s2;n = s1.size();int fg = 0;for (int i = 0; i < n; i++){if (s1[i] != s2[i] && fg == 0){fg = 1;if (s1[i] < s2[i]){swap(s1[i], s2[i]);}}else if (s1[i] != s2[i] && fg){if (s1[i] > s2[i])swap(s1[i], s2[i]);}}cout << s1 << '\n'<< s2;
}
D. Colored Balls
Problem - D - Codeforces
dp。
题意:有 nnn 种球,每种 aia_iai 个。定义一个子集的权值为满足 每组球个数 ≤2 且每组球中种类互不相同 的最小分组数量,求 nnn 种球的 2n2n2n 个子集的权值之和。
思路:我们容易想到对于任意一个集合,它的权值应该为max(max∑i=1nai,sum/2)max(max\sum_{i=1}^n a_i,sum/2)max(max∑i=1nai,sum/2)。sum为集合球数。
显然权值与当中颜色的球数有关,所以我们排序处理。
dp[j]dp[j]dp[j]记录用前几种颜色的 j 个球组成的子集数量。
const int mod = 998244353;
int dp[N]; // j个球组成的颜色组合数
void solve()
{cin >> n;m = 0;rep(1, i, n){cin >> a[i];m += a[i];}dp[0] = 1;sort(a + 1, a + 1 + n);rep(1, i, n){ // 遍历颜色x = a[i]; // 当前颜色球数for (int j = 0; j <= m; j++){if (j <= x) //如果总数<=当前颜色,则为当前颜色球数{ans += dp[j] * x%mod;}else //否则如3 3 1需要4组,为sum/2上取整{ans += (x + j + 1) / 2 * dp[j]%mod;}}for (int j = m; j >= x; j--) // 1 3 3 的4出现两次,由两个1+3组合{dp[j] = (dp[j]+dp[j - x])%mod;}}cout << ans%mod;
}
E. Chain Reaction
Problem - E - Codeforces
贪心。
题意:给定一个数组,每次可以选择连续的一段-k,问使得所有数变成0最少几次。依次输出k为1-maxn的答案。
思路:我们考虑通过记录每个点的死亡点,即a[i]+1,来计算死亡后连续段的变化量。
每次攻击次数即为当前的连续段数量。
void solve()
{cin >> n;maxn = 0;rep(1, i, n){cin >> a[i];maxn = max(maxn, a[i]);e[a[i] + 1].emplace_back(i);b[i] = 1;}rep(1, i, maxn){c[i] = c[i - 1];for (auto j : e[i]){c[i] += (b[j - 1] & b[j + 1]) - ((!b[j + 1]) & (!b[j - 1]));b[j] = 0;}}/* rep(1, i, maxn){cout << c[i] << ' ';} */cout << '\n';rep(1, i, maxn){ans = 0;for (int j = 1; j <= maxn; j += i){ans += c[j] + 1;}cout << ans << ' ';}
}