2020牛客暑假多校训练营 (第十场) A,E,I

A Permutation


官方题解分析的很清楚了,数*2构成环,数*3连向其它的环,所以我们就是能乘2就乘2,不能乘2就乘3。

#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1e6+5;
int T,p;
bool vis[maxn];
int ans[maxn];
int main()
{
    scanf("%d",&T);
    while(T--)
    {
       scanf("%d",&p);
       for(int i=1;i<p;++i)
       vis[i]=0;
       ans[1]=1;
       vis[1]=1;
       int tmp=1;
       bool flag=0;
       for(int i=2;i<p;++i)
       {
           if(!vis[(tmp*2)%p])
           {
               ans[i]=(tmp*2)%p;
               vis[(tmp*2)%p]=1;
               tmp=(tmp*2)%p;
           }
           else
           if(!vis[(tmp*3)%p])
           {
               ans[i]=(tmp*3)%p;
               vis[(tmp*3)%p]=1;
               tmp=(tmp*3)%p;
           }
           else
           {
               flag=1;
               break;
           }
       }
       if(flag)
       puts("-1");
       else
       {
           for(int i=1;i<p;++i)
           printf("%d ",ans[i]);
           puts("");
       }
    }
    return 0;
}

E Game


取前缀和/len(前缀和长度)的最大值。

#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
int T,n;
ll a,sum,ma;
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        sum=ma=0;
        for(int i=1;i<=n;++i)
        {
            scanf("%lld",&a);
            sum+=a;
            ma=max(ma,sum/i+(sum%i>0));
        }
        printf("%lld\n",ma);
    }
    return 0;
}

I Tournament


构造题,我们要让每一个队伍都待差不多的时间,假如一共有10个队伍,1 最先开始,那么其要在中间部分结束,10要在中间部分开始,那么中间开始就是(1,10)。中间部分,6-9期望9是最晚来的所以,最后应该是 (1,9)。然后向前依次是 (1,8),(2,8)…。1-5中期望1是最早结束的,所以应该先是(1,10),然后向后依次是 (2,9),(2,10)…。我们再看开始的部分,我们期望5最晚来,所以最后是(1,5),(2,5),(3,5),(4,5)。然后向前依次是(1,4),(2,4),(3,4)…。再看最后的部分,我们期望6是最早走的,那么开始是(6,7),(6,8),(6,9),(6,10)。然后向后依次是,(7,8),(7,9),(7,10)…。

#include <iostream>
#include <stdio.h>
using namespace std;
int T,n;
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=2;i<=n/2;++i)
        for(int j=1;j<i;++j)
        printf("%d %d\n",j,i);
        for(int i=n/2+1;i<n;++i)
        for(int j=1;j<n-i+1;++j)
        printf("%d %d\n",j,i);
        for(int i=1;i<=n/2;++i)
        for(int j=n-i+1;j<=n;++j)
        printf("%d %d\n",i,j);
        for(int i=n/2+1;i<n;++i)
        for(int j=i+1;j<=n;++j)
        printf("%d %d\n",i,j);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44491423/article/details/107975424