文章目录
- CF 1917C Watering an Array
- CF 1894C Anonymous Informant
CF 1917C Watering an Array
题目链接
稍微被卡到的点是,想到要枚举一开始进行多少次操作1的时候,没想到最多枚举2n次,因为n个元素带来的最大贡献就是n了,如果使用一次操作1+一次操作2的组合,只需要2n次就可以得到n的贡献
#include <bits/stdc++.h>using namespace std;#define int long long
using i64 = long long;typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;const int N = 2e5 + 10;
const int mod = 1e9 + 7;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;void solve()
{int n, k, d;cin >> n >> k >> d;vector<int> a(n + 1);for (int i = 1; i <= n; i ++ ) cin >> a[i];vector<int> b(k + 1);for (int i = 1; i <= k; i ++ ) cin >> b[i];int ans = 0;for (int i = 0; i <= min(2 * n, d); i ++ ){int tmp = 0;int tt;if (i % k == 0 && i != 0) tt = k;else tt = i % k;for (int j = 1; j <= b[tt]; j ++ ) a[j] ++ ;for (int j = 1; j <= n; j ++ )if (a[j] == j) tmp ++ ;ans = max(ans, tmp * min((i64)1, d - i) + (d - i - 1) / 2);}cout << ans << '\n';
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int t = 1;cin >> t;while (t -- ){solve();}
}
CF 1894C Anonymous Informant
题目链接
注意到每次就是把符合要求的数挪到数组末尾,所以从末尾开始往前看每一个末尾是否满足要求就可以
#include <bits/stdc++.h>using namespace std;#define int long long
using i64 = long long;typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;const int N = 2e5 + 10;
const int mod = 1e9 + 7;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;void solve()
{int n, k;cin >> n >> k;vector<int> b(n);for (int i = 0; i < n; i ++ ) cin >> b[i];int idx = n - 1;vector<bool> st(n);while (k -- ){if (b[idx] > n){cout << "NO\n";return;}idx = (idx + n - b[idx]) % n;if (st[idx]){cout << "YES\n";return;}st[idx] = true;}cout << "YES\n";
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int t = 1;cin >> t;while (t -- ){solve();}
}