20231114
2023/11/14
为了这道题,昨天去学的bitset
1862F - Magic Will Save the World
思路:bitset优化可行性dp,注意到杀死所有怪物的魔法是一定的,所以问题转化成能否消耗i点水魔法和sum-i点火魔法来杀怪物。用dpi来分割方案是否可行。直接转移是O(n * n * si)的复杂度,1e8*常数,会T,用bitset优化可以过
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define Acode ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define int long long
const int N = 1e6 + 10;
int s[N];
bitset<N> dp;
void solve()
{
int w, f;
cin >> w >> f;
int n;
cin >> n;
dp.reset(); //全部置为0,初始化
dp[0] = 1;
int sum = 0;
for (int i = 1; i <= n; i++)
{
cin >> s[i];
dp |= (dp << s[i]); //用bitset的移位运算来求出一种魔法的所有可行性情况
sum += s[i];
}
int ans = 1e9;
for (int i = 0; i <= sum; i++)
{
if (dp[i])
ans = min(ans, max((int)ceil(1.0 * i / w), (int)ceil(1.0 * (sum - i) / f)));
// ans = min(ans, max((i - 1) / w + 1, (sum - i - 1) / f + 1));
}
cout << ans << endl;
}
signed main()
{
Acode;
int T = 1;
cin >> T;
while (T--)
{
solve();
}
return 0;
}
D. Sorting By Multiplication
感觉区间的思维题还是不是很会处理
本题思路:因为可以任意规定x,所以我们总是可以一次让一段单调的区间和另一段单调性相同的合并。
而x可以为负数,那么我们就枚举每个点作为分界点。左边是负数,右边是正数,然后可以用前缀和来优化。
感觉还是要想清楚对于一段区间怎么做是最优的,然后再想
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define Acode ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define int long long
const int N = 1e6 + 10;
int f1[N], f2[N];
int a[N];
void solve()
{
int n;
cin >> n;
for (int i = 1; i <= n + 1; i++)
{
f1[i] = f2[i] = 0;
a[i] = 0;
}
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
int ans = 1e9;
for (int i = 1; i <= n; i++)
{
f1[i] = f1[i - 1];
if (a[i] >= a[i - 1])
f1[i]++;
}
for (int i = n; i >= 1; i--)
{
f2[i] = f2[i + 1];
if (a[i] >= a[i + 1])
f2[i]++;
}
for (int i = 0; i < n; i++)
{
ans = min(ans, f1[i] + f2[i + 1] - 1);
}
ans = min(ans, f1[n]);
cout << ans << endl;
}
signed main()
{
Acode;
int T = 1;
cin >> T;
while (T--)
{
solve();
}
return 0;
}
下午vp AtCoder Beginner Contest 302 solve(5/8)
https://www.bilibili.com/video/BV1bw411N7jz/?vd_source=7b3be65640481106bef731ef741a960f
感觉atcoder打的比cf要好些,不会是思维还差一些吧,不会吧,不会吧

浙公网安备 33010602011771号