总结一下前几天 C F CF CF上的比赛,因为那个时间对我不太友好,所以我是虚拟参赛的
这是一场在 2024 2024 2024年 3 3 3月 19 19 19号的比赛。
于是乎 —— —— ——题解诞生了
A. Setting up Camp
题目:点一下吧
不是负数就把c全部安排三人间,有余数再加1。
优先考虑 a a a这种人(有点烦, 但对于我们来说还挺好):至少要有 a a a个帐篷
其次是 b b b:他要三个人住,如果 b b b不是 3 3 3的倍数,就从 c c c那边拿人过来,帐篷再加 b / 3 b/3 b/3
最后如果 c c c是负数,则无法完成分配,输出 − 1 -1 −1。
A-ACcode:
#include <iostream> // 基本入出力ストリーム
#include <algorithm> // 一般的なアルゴリズム(ソート、ルックアップ、やり直し、二分ルックアップなど)
#include <vector> // 動的配列(スペースが足りないと自動的に拡張されます)
#include <queue> // スタック(先に入って先に出ます)
#include <stack> // スタック(先に入ってから出ます)
#include <set> // 集合(反復しない順序)です
#include <map> // キー値対コンテナ(マッピング)
#include <list> // 両方向リスト
#include <math.h> // すうがくかんすう
#include <functional> // 通用的函数绑定和调用机制一般的なバインディングと呼び出しの仕組み
#define endl '\n'
#define pii pair<int, int>
#define pdd pair<double, double>
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
using namespace std;
const int inf = 1e9 + 7;
const int mod = 998244353;
const int N = 2e5 + 10, M = N << 1;
void solve() {
int a, b, c;
cin >> a >> b >> c;
int ans = a;
while(b % 3 != 0) {
b++;
c--;
}
if(c < 0) {
cout << -1 << endl;
return;
}
ans += b / 3;
ans += c / 3;
if(c % 3) ans++;
cout << ans << endl;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t = 1;
cin >> t; // 非多组测试数据请注释该行
while(t--) solve();
return 0;
}
然后是B:
B. Fireworks
题目:我还是不能复制QAQ
烟花启动之后,每隔 a a a分钟都会发射一次,持续 m m m时间,即 [ a , a + m ] [a,a+m] [a,a+m],都有烟花。
b b b烟花启动之后,每隔 b b b分钟都会发射一次,持续 m m m时间,即 [ b , b + m ] [b,b+m] [b,b+m],都会有烟花。
a a a , , , b b b 烟花同时发射,同一时间最多看到几个烟花。
由于是同时发射的,所以区间是 [ 1 , m ] [1,m] [1,m],所以只需要考虑 m m m 里面 a a a 和 b b b 可以发射几次即可
ACcode:
#include <iostream> // 基本入出力ストリーム
#include <algorithm> // 一般的なアルゴリズム(ソート、ルックアップ、やり直し、二分ルックアップなど)
#include <vector> // 動的配列(スペースが足りないと自動的に拡張されます)
#include <queue> // スタック(先に入って先に出ます)
#include <stack> // スタック(先に入ってから出ます)
#include <set> // 集合(反復しない順序)です
#include <map> // キー値対コンテナ(マッピング)
#include <list> // 両方向リスト
#include <math.h> // すうがくかんすう
#include <functional> // 通用的函数绑定和调用机制一般的なバインディングと呼び出しの仕組み
#define endl '\n'
#define pii pair<int, int>
#define pdd pair<double, double>
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
using namespace std;
const int inf = 1e9 + 7;
const int mod = 998244353;
const int N = 2e5 + 10, M = N << 1;
void solve(){
long long a, b, m;
cin >> a >> b >> m;
cout << m / a + 2 + m / b<< endl;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin >> t; // 非多组测试数据请注释该行
while(t--) solve();
return 0;
}
好了我摊牌了我还在参加虚拟赛
下一题o( ̄▽ ̄)ブ
C. Left and Right Houses
每个房子为 0 0 0或者 1 1 1, 0011111 0011111 0011111这样就是一排房子,你需要在其中修一条路,放在任意的房子 i i i 之后。假设路修在 i i i 之后,需要满足条件:
1、左侧至少有 i / 2 i/2 i/2 个 0 0 0
2、右侧至少有 ( n − i ) / 2 (n-i)/2 (n−i)/2 个 1 1 1(两个条件除法均向上取整)
所有合法的位置 i i i,输出使得 ∣ n / 2 − i ∣ |n/2 - i| ∣n/2−i∣ 最小的位置。
对于任意的位置,左侧的 0 0 0的数量用前缀和来维护,右侧的 1 1 1用后缀和来维护,就可以 O ( 1 ) O(1) O(1)访问。
满足情况的位置全部存下来,最后再对 ∣ n / 2 − i ∣ |n/2 - i| ∣n/2−i∣ 进行判断。(注意这里不是整除, n / 2 n/2 n/2要用 d o u b l e double double类型,否则会产生错误)
顺带一提,C题有借鉴一下大佬的思路的
应该还有 ( ) () ()以后会出 ( ) () ()还在整理 ( ? (? (?