Codeforces Round 867 (Div. 3)(A-C)

发布时间 2023-04-25 16:11:22作者: 蓝银杏-SSW

A. TubeTube Feed

签到题


思路

往后走,每次减一,记录当前所能得到最大的bi

完整代码

#include<bits/stdc++.h>
using namespace std ;
#define ll long long
inline ll read(){
    ll s=0 ; char g=getchar() ; while( g>'9'||g<'0')g=getchar() ; 
    while( g>='0'&&g<='9')s=s*10+g-'0',g=getchar() ; return s ; 
}
ll a[51] , b[51] ; 
void solve(){
    ll n = read() , k = read() ; 
    for( int i = 1 ; i <= n ; ++i )a[i] = read() ; 
    for( int i = 1 ; i <= n ; ++i )b[i] = read() ;
    ll ans = -1 , mans = 0 ; 
    for( int i = 1 ; i <= n ; ++i ){
        if( k >= a[i] && b[i] > mans )mans = b[i] , ans = i ;
        k-- ; 
    }
    cout<<ans<<endl ; 
}
int main(){
    ll q = read() ; 
    while( q-- ){
        solve() ; 
    }
    return 0 ; 
}

B. Karina and Array

ssw:笑死,搞忘初值不能为0了


思路

通常来说,记录数列中的最大值和次大值,相乘即答案
但存在负值,所以还要记录最小值和次小值
二者取max

注意下初始值的问题,不要赋值为0

完整代码

#include<bits/stdc++.h>
using namespace std ;
#define ll long long
void solve(){
    ll n  ; cin>> n ; 
    ll max1 = -1000000001 , max2 = -1000000001 , min1 = 1000000001 , min2 = 1000000001 ;
    for( int i = 1 ; i <= n ; ++i ){
        ll x ; cin>>x ; 
        if( x >= max1 ){
            max2 = max1 ; max1 = x ;
        }
        else if( x >= max2 )max2 = x ;
        if( x <= min1 ){
            min2 = min1 ; min1 = x ;
        }
        else if( x <= min2 )min2 = x ; 
    } 
    cout<<max( max1*max2 , min1*min2 )<<endl ; 

}
int main(){
    ll q ; cin>>q ; 
    while( q-- ){
        solve() ; 
    }
    return 0 ; 
}

C. Bun Lover

XXX:这不都是一眼题吗?


思路

主要思路

找规律嘛, f[n+1] = f[n]+2*n+1
然后拆开递推式即可f[n]=2+2n+n^2

代码

void solve(){
    ll n  ; cin>> n ; 
    cout<<2ll+2ll*n+n*n<<endl ;
}

D. Super-Permutation

fxs:看6就行
橘子熊:我猜的,但对了


思路

主要思路

首先明确我们是要利用前缀和取模后再凑出一组 0 到 n-1
然后看看样例取模,就能找到规律 0 5 1 4 2 3
反向推出数列即可

代码