cf 1557(div2)

比赛链接:https://codeforces.com/contest/1557

一小时做完了A,B,C,剩下一小时想D,也没想出来。不过最终是500多名,上了一百多分,真舒适。因为是和排名有关的计分,所以做题速度很重要啊。

 

A

分析:

当时感觉是直接让最大数一组,剩下的另一组,写了就过了;

详细证明 Editorial 写了。

代码如下:

cf 1557(div2)
#include<iostream>
#include<algorithm>
#define db double
using namespace std;
int const N=1e5+5;
int T,n;
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n); db sum=0; int mx=-1e9-1;
        for(int i=1,x;i<=n;i++)
        {
            scanf("%d",&x); sum+=x;
            if(x>mx)mx=x;
        }
        printf("%lf\n",mx+(sum-mx)/(n-1));
    }
    return 0;
}
A

 

B

分析:

离散化一下,找最多的连续上升子段的个数,小于等于\( k \)就可以,因为它们内部可以随便再分。

代码如下:

cf 1557(div2)
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int const N=1e5+5;
int T,n,k,a[N],b[N];
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]),b[i]=a[i];
        sort(b+1,b+n+1);
        for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+n+1,a[i])-b;
        int cnt=1;
        for(int i=2;i<=n;i++)
        {
            if(a[i]==a[i-1]+1)continue;
            else cnt++;
        }
        if(cnt<=k)puts("Yes");
        else puts("No");
    }
    return 0;
}
B

 

C

分析:

如果\( n \)是奇数,那么\( \& \)为\( 1 \)的位上\( \bigoplus \)也是\( 1 \);所以要枚举\( k \)个位置上一共有几个\( 1 \),分别在哪儿,然后让其他位上都是\( 0 \)。

如果\( n \)是偶数,那么\( \& \)为\( 1 \)的位上\( \bigoplus \)是\( 0 \);所以枚举哪个位置出现第一个\( 1 \),让前面的位都是\( 0 \),后面的位随便取;还要加上没有\( 1 \)的方案数。

让一个位保证是\( 0 \),也就是找到\( < n \)的偶数个数,让它们在该位取\( 1 \),其他数在该位取\( 0 \)。

懒得写公式了所以用文字描述了半天;公式看代码即知。

代码如下:

cf 1557(div2)
#include<iostream>
#define ll long long
using namespace std;
int const N=2e5+5,md=1e9+7;
int T,n,k;
ll cc,ans,fc[N],inv[N];
ll pw(ll x,ll y)
{
    ll ret=1,a=x%md;
    while(y)
    {
        if(y&1)ret=ret*a%md;
        a=a*a%md;
        y>>=1;
    }
    return ret;
}
ll C(int a,int b){return a<b?0:((fc[a]*inv[b])%md*inv[a-b])%md;}
void init()
{
    cc=0; ans=0;
    for(int i=0;i<n;i+=2)cc=(cc+C(n,i))%md;
}
int main()
{
    scanf("%d",&T);
    fc[0]=1;
    for(int i=1;i<N;i++)fc[i]=(fc[i-1]*i)%md;
    inv[N-1]=pw(fc[N-1],md-2);
    for(int i=N-2;i>=0;i--)inv[i]=(inv[i+1]*(i+1))%md;
    while(T--)
    {
        scanf("%d%d",&n,&k); init();
        if(k==0){printf("1\n"); continue;}
        if(n%2)
        {
            for(int i=0;i<=k;i++)
                ans=(ans+C(k,i)*pw(cc,k-i)%md)%md;
        }
        else
        {
            ans=pw(cc,k);
            for(int i=1;i<=k;i++)
                ans=(ans+pw(cc,k-i)*pw(pw(2,n),i-1)%md)%md;
        }
        printf("%lld\n",ans);
    }
    return 0;
}
C

 

cf 1557(div2)

上一篇:Jmeter-用户参数&用户定义的变量


下一篇:k8s之Service详解-Service介绍