Contestant. Rank 1761. Rating +54.
A. Lame King
题意
给定一个坐标系,其中
规定若需要连续从相同方向移动,需要间隔一秒。
思路
首先,若我们需要一直向右,那么停留一秒绝对比向垂直方向绕路快,所以,我们不妨以折线的方式移动,直到横坐标或纵坐标等于终点时,向同一方向间隔移动。
时间复杂度:
对应AC代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
const int N = 2e5 + 10, inf = 0x3f3f3f3f3f3f3f3f, mod = 998244353;
void init(){}
void solve() {
int a, b;
cin >> a >> b;
a = abs(a), b = abs(b);
cout << (a + b) + (a != b ? abs(a - b) - 1 : 0) << '\n';
}
signed main() {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
init();
int t;
cin >> t;
while (t --) solve();
}
画个图的事情((
B. Vaccination
题意
对于
思路
为了要当前的包装可以包括更多的人,我们不妨在某一个病人的
就这样,没了。
时间复杂度:
对应AC代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
const int N = 2e5 + 10, inf = 0x3f3f3f3f3f3f3f3f, mod = 998244353;
void init(){}
void solve() {
int n, k, d, w;
cin >> n >> k >> d >> w;
int ans = 0;
vector<pii> a(n);
for(int i=0;i<n;i++){
cin >> a[i].first;
a[i].second = a[i].first + w;
}
int i = 0;
while(i < n){
int l = a[i].second, r = l + d;
int now = i;
for(int j=0;j<k;j++){
if(i + j >= n || a[i + j].first > r) break;
now ++;
}
ans ++;
i = now;
}
cout << ans << '\n';
}
signed main() {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
init();
int t;
cin >> t;
while (t --) solve();
}
这还需要证明吗,这还需要证明吗(
C. Pull Your Luck
题意
给定一个圆盘,按顺序写好了
思路
首先,我们很容易列出一个式子:
但这个式子推不了什么。
有趣的是,若我们一直循环加上数的话,在取到
因而,在一个周期内,若出现了
时间复杂度:不大就对了
对应AC代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
const int N = 2e5 + 10, inf = 0x3f3f3f3f3f3f3f3f, mod = 998244353;
void init(){}
void solve() {
int n, x, p;
cin >> n >> x >> p;
int cur = x;
for(int i=1;i<=min(p, 2*n);i++){
cur = (cur + i) % n;
if(cur == 0) {
cout << "YES\n";
return;
}
}
cout << "NO\n";
}
signed main() {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
init();
int t;
cin >> t;
while (t --) solve();
}
捏吗,一直在想怎么搞式子
D. Accommodation
题意
给定
思路
若我们需要让个数尽可能大,我们当然希望将
相反地,要让个数尽可能小,我们就希望尽可能不将
有趣的是,只要分割出
当然,如果这题数据量小的话,可以
时间复杂度:
对应AC代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
const int N = 2e5 + 10, inf = 0x3f3f3f3f3f3f3f3f, mod = 998244353;
void init(){}
void solve() {
int n, m;
cin >> n >> m;
int mn = 0, mx = 0;
while (n--) {
string s;
cin >> s;
int c1 = 0, c2 = 0, tot = 0;
for (int i = 0; i < m; i++) tot += s[i] - '0';
for (int i = 0; i < m - 1; i ++)
if (s[i] == '1' && s[i + 1] == '1') c1 ++, i ++;
for (int i = 0; i < m - 1; i ++)
if (s[i] == '0' || s[i + 1] == '0') c2 ++, i ++;
mn += tot - min(c1, m / 4);
mx += tot - max(0ll, m / 4 - c2);
}
cout << mn << ' ' << mx << '\n';
}
signed main() {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
init();
int t = 1;
//cin >> t;
while (t --) solve();
}
似了,在想怎么dp,贪心还没贪对(一直想着拆
- 本文链接 https://floating-ocean.github.io/blog_old/posts/1381135032/
- 版权声明 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!