首页 > 其他分享 >Codeforces Round 942 (Div. 2)

Codeforces Round 942 (Div. 2)

时间:2024-05-01 19:11:05浏览次数:39  
标签:gcd int cout 942 Codeforces ++ ans Div 题意

Codeforces Round 942 (Div. 2)

A. Contest Proposal

题意:有n个题目,每个题目的难度为a[i],要求每个题目的难度不大于对应的b[i],每次可以添加一个题目并且删去最难的题目,求最多能添加几个题目

思路:暴力枚举即可,只要a[i]大于b[i],就把a[n]改为b[i],然后重新排序

void solve(){
    int n;
    cin >> n;
    vector<int> a(n + 1), b(n + 1);
    for(int i = 1; i <= n; i ++) cin >> a[i];
    for(int i = 1; i <= n; i ++) cin >> b[i];
    int ans = 0;
    while(1){
        bool ok = 1;
        for(int i = 1; i <= n; i ++){
            if(a[i] > b[i]){
                ans ++;
                a[n] = b[i];
                sort(a.begin() + 1, a.end());
                ok = 0;
            } 
        }
        if(ok) break;
    } 
    cout << ans << '\n';
}

B. Coin Games

题意:有n个硬币围成一圈,每次可以把朝上的硬币拿走并且翻转相邻的硬币,直到不能翻转硬币就输了

思路:看样例猜?奇数先手必胜,因为每次只能减少奇数个向上

void solve(){
    int n;
    string s;
    cin >> n >> s;
    int sum1 = 0;
    for(auto c : s){
        if(c == 'U') sum1 ++;
    }
    if(sum1 & 1) cout << "YES\n";
    else cout << "NO\n";
}

C. Permutation Counting

题意:开始对应i的牌有a[i]张,同时还有k张可以随意选择点数的空白牌,求把所有牌任意顺序排列后,这个序列中n的一个排列的子串数量的最大值

思路:先按照数量排序,大的在前,可以发现牌的点数顺序是无所谓的们只要n张不同的连在一起就是一个排列,然后二分能过组成的完整整套排列的数量,答案就是l * n - n + 1,最后把多出来的牌往后补,直到无法补,别忘了可能剩余的空白牌

这里要注意一下二分的上界,应该是a[i]+k,所以是2e12,如果太大会炸longlong

void solve(){
    int n, k, sum = 0;
    cin >> n >> k;
    vector<PII> a(n + 1);
    for(int i = 1; i <= n; i ++){
        int x;
        cin >> x;
        a[i] = {x, i};
        sum += x;    
    }
    sort(a.begin() + 1, a.end(), greater<PII>());
    
    auto check =[&](int mid) -> bool{
        int k1 = k;
        for(int i = 1; i <= n; i ++){
            if(a[i].first < mid){
                k1 -= mid - a[i].first;
            }
        }
        if(k1 >= 0) return true;
        else return false;
    };
    int l = 0, r = 2e12;
 
    while(l < r){
        int mid = l + r + 1 >> 1;
        if(check(mid)) l = mid;
        else r = mid - 1;
    }
    for(int i = 1; i <= n; i ++){
        if(a[i].first >= l) a[i].first -= l;
        else{
            k -= (l - a[i].first);
            a[i].first = 0;
        } 
    }
//    cout << l << '\n';
    int ans = l * n - n + 1;
    for(int i = 1; i <= n; i ++){
        if(a[i].first > 0) ans ++;
        else{
            if(k > 0){
                k --;
                ans ++;
            }
            else break;
        }
    }
    cout << ans << '\n';
}

D1. Reverse Card (Easy Version)

题意:给定n, m,求1<=a<=n,1<=b<=m,满足(a+b)能整除b*gcd(a, b)的数量

思路:设k为(a+b)/b*gcd(a, b),则kb = (a+b)/gcd(a+b),如果gcd(a, b)|(a+b),则a是b的倍数,所以gcd(a, b)==b,则k*b*b = a+b,枚举k即可

void solve(){
    ll n, m;
    cin >> n >> m;
    ll ans = 0;
    for(int i = 1; i <= m; i ++){
        if(i * i - i > n) break;
        for(int j = 1; j; j ++){
            if(j * i * i - i > n) break;
            if(j * i * i - i > 0) ans ++;
        }
    }
    cout << ans << '\n';
}

D2. Reverse Card (Hard Version)

题意:如上,但是求满足b*gcd(a, b)能整除(a+b))的数量

思路:(a+b)|(b*gcd(a, b)),假设gcd(a, b)=d,则(pd+qd) | gd2,gcd(p, q)是1,因为两个数除以它们的gcd肯定互质

(a+b)|(b*gcd(a,b)) <==> (pd+qd)|(qd2) <==> (p+q)|(qd)

已知 gcd(p+q,q)=gcd(p,q)=1,所以(p+q)|d

又因为a=pd, b = qd,则a整除p,b整除q

二者要同时满足,取min即可

void solve(){
    ll n, m;
    cin >> n >> m;
    ll ans = 0;
    for(int i = 1; i <= n / i; i ++){
        for(int j = 1; j <= m / j; j ++){
            if(__gcd(i, j) == 1){
                ans += min(n / ((i + j) * i), m / ((i + j) * j));
            }
        }
    }
    cout << ans << '\n';
}

 

标签:gcd,int,cout,942,Codeforces,++,ans,Div,题意
From: https://www.cnblogs.com/RosmontisL/p/18169556

相关文章

  • Codeforces Round 942 Div.2 题解
    蹭个热度,挽救一下cnblogs蒸蒸日上的阅读量。Q:你是手速狗吗?A:我觉得我是。2A因为选的\(w\)一定可以让它合法,一次操作可以看作\(a\)数组向右平移一位。枚举操作次数后暴力判断即可。#include<bits/stdc++.h>voidwork(){ intn; std::cin>>n; std::vector<......
  • C. Add, Divide and Floor
    链接:https://codeforces.com/problemset/problem/1901/C洛谷链接:https://www.luogu.com.cn/problem/CF1901C思路:首先去重:这里建议分清楚总操作数n和元素总数cnt。然后把去重的元素放在数组中,sort让它升序,取两个极端的差。(因为中间的数会被并到里面去,就是说,可以理解为区间收缩)......
  • Educational Codeforces Round 165 (Rated for Div. 2) 题解
    A对于\(i\top_i\)连边。如果存在二元环,则答案为2。否则答案为3。B非降序排序:0全部在1前面。令0的个数为z。从左往右,将前z个全部填上0。填第\(i\)位时,每次填的最小代价为:若第\(i\)位为1,第\(i\)位右边的第一个0到\(i\)之间的字符个数。(贪心)......
  • Codeforces Round 921 (Div. 1)
    CF1924A签到题CF1924B用set记录每个关键点的位置,每次操作带来的影响可以转化为区间加和区间乘。结果在longlong范围内但过程中可能会超。比较tricky的做法是找一个大于ans的大质数p。在\(GF(p)\)上计算。非常坏卡常CF1924C小学奥数,注意到每次折叠产生的两种折痕长度相等。前......
  • DiviDuelo
    我们先模拟样例,会发现\(1\)是一个特别的数字,如果firstplayer拿到了\(1\)那么肯定就输了于是不难得出结论,如果\(n\)是一个完全平方数,那么firstplayer就G了那么考虑不是完全平方数,显然这里考虑gcd不是\(1\)非常困难,于是考虑secondplayer怎么样才能赢由于gcd要为\(1\),不难想到......
  • Educational Codeforces Round 164 (Div. 2)
    A-PaintingtheRibbon难度:⭐⭐解题思路先看特殊情况,如果m为1肯定不行,n小于等于k也不行;我们可以换位思考,如果Alice用了x种颜色,Bob想把其染为同一种颜色,肯定要先找出这x种颜色中染色区域最多的那一种,然后把其他区域的颜色换成该颜色,这样才是最优策略,所......
  • Manthan, Codefest 18 (rated, Div. 1 + Div. 2) D. Valid BFS?
    题意:给一个树和一个bfs序,并保证从节点1出发,判bfs序是否合法。思路:双指针,在bfs序上从左往右遍历。慢指针指向当前节点u,快指针指向当前节点应该访问的节点的位置。然后设两个集合,一个集合存储在当前节点上应该访问的节点,另一个存储在当前节点上实际访问的节点,然后遍历即可。总结:......
  • Educational Codeforces Round 164
    A-C简单数学题先跳过了,E题水平有限,暂时写不出来下面是D的题意ColoredBall(https://codeforces.com/contest/1954/problem/D)看题目,对于初学者来说,可能不知道使用DP怎么联想到DP的可能还是经验问题下面是个人对题目的拙见题目要求所有幂集组合里需要至少需要多少个二元对才......
  • Codeforces Round 941 (Div. 1) 题解(A-C)
    比赛链接:https://codeforces.com/contest/1965官解链接:https://codeforces.com/blog/entry/128914比较手速的一场,C与D之间出现了较大的gifficultygap。所幸C题猜得比较快(虽然证明其实比较难),最终rank190,performance2525,成功压线拿下Grandmaster。cpchenpi,堂堂上红!......
  • Codeforces Round 941 (Div. 2)
    A.CardExchange贪心。如果有某个数出现\(k\)次及以上,则通过操作使其数量变为\(k\),再变为其他出现过的数,则会增加至至少\(k\)个,一直进行如上操作,可以发现数组最终只剩\(k-1\)个数;否则为\(n\)。#include<bits/stdc++.h>usingnamespacestd;#definecctieios::......