欢迎光临散文网 会员登陆 & 注册

Codeforces Round 860 (Div. 2)

2023-03-28 09:50 作者:羽走  | 我要投稿

上课无聊敲不了代码,写写复盘。加油吧。

C -- Candy Store 数学 赛时死在这道题目上了,没看出来咋算的,也想着贪心但是不会写。赛后去找了很多题解感觉都写得有点麻烦。于是秉持着最简单的代码思路一定最简单的原则,去找了个最简短的代码。思路大概是下面这样(数学推了一下午没看明白 哭.jpg) 先求出一个糖果的总价格,然后去和下一个糖果的总个数求最大公约数,然后再求一个单价与包装个数的乘积除以他俩的最大公约数(这一步没推出来是为啥😭)。 然后如果此时的总价格的公约数无法整除后面这个数字的话,那就ans++,最后把总价格和包装个数更新就好。 // Problem: C. Candy Store #include #define int long long using namespace std; signed main() { int T; cin >> T; while( T-- ) { int n; cin >> n; int ans = 1, s = 0, k = 1; for( int i = 1 ; i <= n ; i++ ) { int x, y; cin >> x >> y; s = __gcd(s, x*y); k = k*y/__gcd(k, y); if( s%k ) { s = x*y; k = y; ans++; } } cout << ans << "\n"; } } (手机端甚至不能插入代码块属实难蚌🙄) D -- Shocking Arrangement 构造 贪心 赛后一看发现D也不难,但写到C就下班了😰。题目大意就是给你一个数组,总和为0,然后需要你重新构造一下,使得任意一个区间的和的绝对值都要<数组的最大值-数组的最小值。 其实这个题,提前手搓两组数据就会发现,只有数组全为0是才会为no 其他一定有解,这样就可以先给数组排列,从两边开始遍历,如果当前和<0那就加入一个正数,>0的话就加入一个负数,只有全为0是才会输出no。(下次下班前一定先把后面的题看完😅) #include using namespace std; const int N = 3e5; int a[N+5]; int main() { int T; cin >> T; while( T-- ) { int n; cin >> n; for( int i = 1 ; i <= n ; i++ ) cin >> a[i]; vectorv; sort(a+1, a+1+n); if( a[1] == 0 && a[n] == 0 ) { cout << "No\n"; continue; } int l = 1, r = n, s = 0; while( l <= r ) { if( s > 0 ) { v.push_back(a[l]); l++; s += a[l]; } else { v.push_back(a[r]); r--; s += a[r]; } } cout << "Yes\n"; for( int i:v ) cout << i << " "; cout << "\n"; } }

机会不多,请务必珍惜。

(你这新版专栏编辑器😅不能搞封面还不能搞头图还不能写tag,标题都写不完只能写一行,还自动吞字,删除这个功能吧)

Codeforces Round 860 (Div. 2)的评论 (共 条)

分享到微博请遵守国家法律