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

Codeforces Round 961 (Div. 2)

时间:2024-07-24 10:56:34浏览次数:13  
标签:cnt 961 int Codeforces long while solve need Div

A

#include<bits/stdc++.h>
using namespace std;
int a[200];
void solve(){
    int n,k;cin>>n>>k;
    a[1]=n;
    for(int j=n-1,i=2;i<=1+(n-1)*2;i+=2,j--){
        a[i]=a[i+1]=j;
    }
    if(!k){
        cout<<0<<"\n";
        return;
    }
    for(int i=1;i<=1+(n-1)*2;i++){
        k-=a[i];
        if(k<=0) {
            cout<<i<<"\n";
            return ;
        }
    }
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int t;cin>>t;
    while(t--){
        //TODO
        solve();
    }
}

B1

考虑双指针,固定左端点 l 然后维护最大的右端点 r 使得 a[r]-a[l]<=1 ,且能凑的花瓣数尽量多。

但是特判没写好,双指针寄了,最后先过了B2,改的B2代码过的B1

B2

考虑都买第一种,剩下的钱再买第二种,还有剩的话考虑加钱把之前买的第一种看能不能升级成第二种(价格只差1,且收益和价格一样,相当于在原来的基础上多花一块钱就能多拿一个花瓣)

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
#define int long long
struct node{
    int v,num;
}a[N];
bool cmp(node a,node b){
    return a.v<b.v;
}
void solve(){
    int n,m;cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i].v;
    for(int i=1;i<=n;i++) cin>>a[i].num;
    
    sort(a+1,a+n+1,cmp);

    int ans=0;
    for(int i=1;i<=n-1;i++){
        int t1=m/a[i].v;
        t1=min(t1,a[i].num);
        ans=max(ans,t1*a[i].v);
        if(a[i+1].v!=a[i].v+1) continue;
        int left=m-t1*a[i].v;
        int t2=left/a[i+1].v;
        t2=min(t2,a[i+1].num);
        ans=max(ans,t1*a[i].v+t2*a[i+1].v);
        left-=t2*a[i+1].v;
        if(left && t2<a[i+1].num ){
            int add=a[i+1].num-t2;
            add=min(add,min(t1,left));
            ans=max(ans,t1*a[i].v+t2*a[i+1].v+add);
        }
    }
    int t1=m/a[n].v;
    t1=min(t1,a[n].num);
    ans=max(ans,t1*a[n].v);
    cout<<ans<<"\n";
    // spj n
}
// 1 1 1 2 4 5 6 7
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int t;cin>>t;
    while(t--){
        //TODO
        solve();
    }
}

C

有人说是典中典,可能做题太少了没见过类似的,觉得还挺有意思。

首先不能暴力扩大,数值很快就爆炸了(实测8 7 6 5 4 3 2 1寄得飞快)

第一次想到了取对数后得到

(偷了其他博主的图)

但是这个式子还是不会处理,没想到再取一次对数变成

然后换了思路,不能维护真实数值的话显然要从原本的值入手

维护一个cnt数组,cnt[i]表示a[i]平方了几次。

考虑 a[i] < a[i-1] ,显然a[i]的大小要先大于等于a[i] ,这个可以暴力求 

然后a[i-1]做了cnt[i-1]次,a[i] 也要跟着做cnt[i-1] 次

a[i]>a[i-1]同理 ,讨论下此时a[i-1]的真实值是否大于a[i] ,若没有大于则不管

若大于了则a[i]也要一起做cnt[i-1]次,但又因为a[i]的初值比a[i-1]大,所以还要扣掉这部分

具体细节见代码

#include<bits/stdc++.h>
using namespace std;
const int N =2e5+5;
#define int long long
int a[N],cnt[N],b[N];
void solve(){
    int n;cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i],cnt[i]=0;
    int ans=0;
    for(int i=2;i<=n;i++){
        if(a[i]<a[i-1]){
            if(a[i]==1) {
                cout<<-1<<"\n";
                return;
            }
            cnt[i]=cnt[i-1];
            int tot=0;
            int tmp=a[i];
            while(tmp<a[i-1]){
                tmp=tmp*tmp;
                tot++;
            }
            cnt[i]+=tot;
        }
        else {
            if(a[i]==a[i-1]) {
                cnt[i]=cnt[i-1];
            }
            else { // a[i]>a[i-1]    
                int need=0,c=a[i-1],d=a[i];
                if(c==1) continue;
                while( c<d ){
                    c=c*c;
                    need++;
                }
                //cout<<i<<" :: "<<c<<" "<<d<<" "<<cnt[i-1]<<"\n";
                if(c==d){
                    if(need<=cnt[i-1]) { // a[i] > a[i-1]
                        cnt[i]=cnt[i-1]-need;
                    }
                    else cnt[i]=0;
                }
                else if(c>d){
                    if(need<=cnt[i-1]) { // a[i] > a[i-1]
                        cnt[i]=1+cnt[i-1]-need;
                    }
                    else cnt[i]=0;    
                }
            }
        }
    }
    
    for(int i=1;i<=n;i++){
            ans+=cnt[i];    
    }
    cout<<ans<<"\n";
}
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    int t;cin>>t;
    while(t--){
        //TODO
        solve();
    }
}

 

标签:cnt,961,int,Codeforces,long,while,solve,need,Div
From: https://www.cnblogs.com/liyishui2003/p/18320381

相关文章

  • Codeforces Round 961 (Div. 2) 补题记录(A~D)
    上大分,赢!A考虑将每一条对角线上可以存放的砝码数量都记录一下,从大到小排序,然后直接暴力贪心选择。此时可以发现数量一定形如\(n,n-1,n-1,n-2,n-2,n-3,n-3,\ldots,1,1\)这样的形式。直接暴力减即可。时间复杂度为\(O(n)\)。#include<bits/stdc++.h>#defineintlonglong......
  • Codeforces 1987C
    codeforcesP1987C给定一个n长度的数组,每一步都要遍历整个数组。如果某个元素是末尾元素或是比其后一个元素大,则该元素减去1直到该元素为0,求解总步数,算法复杂度要求\(O(n)\)先给出暴力解法,复杂度\(O(n^2)\): intt=0; do{ for(inti=0;i<n-1;i++){ if(a[i]......
  • C. Divisor Chain
    原题链接题解任何数一定可以被二进制表示下最低位的一及以下的二次方数整除code#include<bits/stdc++.h>#definelllonglong#definelowbit(x)((x)&(-x))usingnamespacestd;voidsolve(){intn;cin>>n;intm=log2(n);intn1=1<<m;vector......
  • Codeforces Round 957 (Div. 3)复盘
    今天打了一下DIV3,专业转了就是不一样T1Onlypluses这道题主要就是理解乘法分配律,最多的绝对是两数相乘数最大的。T2AngryMonkey这道题一遍AC,虽然很简单还是值得鼓励,主要还是数学问题,用笔写下来找到数学规律之后做起来就很快T3GorillaandPermutation这道题还是很简单......
  • Codeforces Round 952 (Div. 4)复盘
    第一次打比赛的总结Q1CreatingWords这道题其实主要考的就是对于输入语句的理解,最开始我想的是运用scanf,puts,一个语句一个语句的去读取,但是确实对各个输入语句的了解过于肤浅了,特别是哪个读不读空格之类的,其实也算是没有把题目看清楚,它的难度其实没有自己以为的那么难,因为是限......
  • Codeforces 2400+ flows 大杂烩
    CF903GYetAnotherMaxflowProblem2700关键点:最大流转最小割显然我们需要用其他方式维护最大流,考虑到最大流等于最小割,于是我们去求最小割。考虑这个图的特性不难发现左边和右边两列都至多割掉一条边,于是我们直接枚举割掉的位置,剩下的左边前缀和右边后缀所有相连的边都要割......
  • Codeforces Round 960 (Div. 2)
    xht真的好强好强,好厉害这场打得有点史,共四发罚时还是抽象了,如果没有xht就真的完了呜呜。不过也说明我是真的菜,还有把做法想出来之后验证不到位。A.SubmissionBait罚时了,15min才过/lh稍微想一下可以知道,对于最大数\(x\),若其出现次数为奇数,那么A是必胜的,反之则只能从更小......
  • [Codeforces Round 960 (Div. 2)]A-E
    CodeforcesRound960(Div.2)A-EA题意:公平博弈。给定一个数组n个数,每个数只能用一次。给一个\(mx\)。每次轮到自己操作的时候就选一个数组里的数,满足\(a[i]>=mx\),然后令\(mx=a[i]\).双方轮流做直到一方无法操作,则另一方取胜。Sol:赛时1min猜了个错解,只看最大值,只看最大值的出......
  • Codeforces Round 958 (Div. 2)
    Preface周末补题计划的最后一场,这场由于是最古早的所以有些题题意都记不太清了赛时经典发病,前四题一题WA一发,然后把时间打没了E题经典没写完(中间还抽空写了个假做法),邮电部诗人了属于是A.SplittheMultiset刚开始还感觉无从下手,写了个记搜交上去还WA了,后面发现每次分......
  • Codeforces Round 959 sponsored by NEAR (Div. 1 + Div. 2)
    Preface这场比赛的时候CF一直抽风,快10min的时候才登上去,然后中间交题也一直在人机验证50min左右过了前5题后,F没想到生成树当场趋势了,赛后发现原来是原题大战可海星A.DiverseGame将每个数循环移位变为下一个数即可,注意特判\(n=m=1\)的情形#include<cstdio>#incl......