Educational Codeforces Round 104

传送门

A. Arena (*800)

题意

\(n(2\leq n\leq 100)\)个人,每人初始有一个能力值\(a_i\),每次可以随意选择两个人进行一场比赛,能力值高的人能力值加一,当一个人至少赢了\(100^{500}\)场比赛时,他就是冠军,计算可能成为冠军的人数

题解

对于能力值为\(a_i\)的人,如果没有人能力值比他小,那么他无法赢得任何比赛,所以无法成为冠军。反之,只要有任何一个人的能力值比他小,他就可以不断和这个人进行比赛,从而成为冠军。所以答案为总人数减去\(a_i\)最小的人数

#include<bits/stdc++.h>
#define LL long long
#define PII pair<int,int>
#define eps 1e-6
#define lowbit(x) x&(-x)
using namespace std;

const int maxn=110;
int T,n,a[maxn];

int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        sort(a+1,a+1+n);
        int ans=(a+1+n)-upper_bound(a+1,a+1+n,a[1]);
        printf("%d\n",ans);
    }
}

B. Cat Cycle (*1200)

题意

有两只猫\(A\)\(B\)\(n(2\leq n\leq 1e9)\)块它们睡觉所在的毛绒布,这两只猫每小时都会更换睡觉所在地,循环更换:
对于\(A\),循环顺序为\(n,n-1,,n-2,\cdots ,3,2,1,n,n-1,\cdots\)
对于\(B\),循环顺序为\(1,2,3,\cdots ,n-1,n,1,2,\cdots\)
由于\(A\)更年长,所以当\(A\)\(B\)刚好要睡同一块毛绒布时,\(A\)睡这块毛绒布,\(B\)睡它的顺序里的下一块毛绒布
给出小时数\(k(1\leq k\leq 1e9)\),计算经过\(k\)个小时之后\(B\)位于的毛绒布编号

题解

如果\(n\)是偶数,则\(A\)\(B\)不会在同一块毛绒布上相遇,可以通过\(k\% n\)计算\(B\)的位置
如果\(n\)是奇数,则每经过\(\lfloor \frac{2}{n} \rfloor\)步,\(B\)就会比\(A\)多走\(1\)步,可以通过\((k+\lfloor \frac{2}{n} \rfloor)\% n\)计算\(B\)的位置

#include<bits/stdc++.h>
#define LL long long
#define PII pair<int,int>
#define eps 1e-6
#define lowbit(x) x&(-x)
using namespace std;

int T;
LL n,k;

int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%lld %lld",&n,&k);
        k--;
        if(n%2==0){
            printf("%lld\n",k%n+1);
        }
        else{
            LL f=n/2;
            k+=k/f;
            printf("%lld\n",k%n+1);
        }
    }
}

C. Minimum Ties (*1500)

题意

\(n(2\leq n\leq 100)\)支队伍,两两之间进行一场比赛,一共进行\(\frac{n(n-1)}{2}\)场比赛。胜者得\(3\)分,败者得\(0\)分,平局双方各得\(1\)分。构造一种每局的胜败情况,使得所有比赛结束之后所有队伍的分数相同并且平局数量最少

题解

case 1: \(n\)为奇数。每支队伍需要进行\((n-1)\)场比赛,\((n-1)\)为偶数,所以只要每支队伍胜\(\frac{(n-1)}{2}\)场,负\(\frac{(n-1)}{2}\)场,则不需要平局。具体构造方法是将所有队伍按照编号围成一个圆圈,每支队伍与之后\(\frac{(n-1)}{2}\)支队伍的比赛结果为胜,与再之后\(\frac{(n-1)}{2}\)支队伍的比赛结果为负

case 2: \(n\)为偶数。如果所有\(\frac{n(n-1)}{2}\)场比赛全都不是平局,则总得分为\(\frac{3n(n-1)}{2}\),无法整除\(n\),所以需要平局,平局数量最少为\(\frac{n}{2}\)。具体构造方法是将所有队伍按照编号围成一个圆圈,每支队伍与之后\(\frac{(n-2)}{2}\)支队伍的比赛结果为胜,与之后第\(\frac{n}{2}\)支队伍的比赛结果为平局,与再之后\(\frac{n(n-2)}{2}\)支队伍的比赛结果为负

#include<bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
#define PII pair<int,int>
#define PLL pair<LL,LL>
#define PLI pair<LL,int>
#define pi acos(-1.0)
#define eps 1e-6
#define lowbit(x) x&(-x)
using namespace std;

int T,n;

int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        if(n&1){
            for(int i=1;i<=n;i++){
                for(int j=i+1;j<=n;j++){
                    if(j-i<=n/2) printf("1");
                    else printf("-1");
                    if(i==n-1 && j==n) printf("\n");
                    else printf(" ");
                }
            }
        }
        else{
            for(int i=1;i<=n;i++){
                for(int j=i+1;j<=n;j++){
                    if(j-i<n/2) printf("1");
                    else if(j-i==n/2) printf("0");
                    else printf("-1");
                    if(i==n-1 && j==n) printf("\n");
                    else printf(" ");
                }
            }
        }
    }
}

D

题意

给出\(n(1\leq n\leq 1e9)\),计算有多少组\((a,b,c)\)满足
\( \left\{ \begin{matrix} 1\leq a\leq b\leq c\leq n\\ c^2=a^2+b^2\\ c=a^2-b\\ \end{matrix} \right. \)

题解

\(a^2\)代换,得到\(b^2+b=c^2-c\),即为\(b(b+1)=c(c-1)\),也就是\(c=b+1\),所以\(2\leq c\leq n\)。将\(b=c-1\)代入\(a^2=b+c\),得到\(a^2=2c-1\),所以\(a\)为奇数,由于\(a\approx \sqrt{c} \leq \sqrt{n}\),所以可以枚举\(a\),时间复杂度\(O(\sqrt{n})\)。也可以直接推出式子得到答案:\(ans=\frac{\sqrt{2n-1}+1}{2}-1\),时间复杂度\(O(1)\)
\(O(\sqrt{n})\)

#include<bits/stdc++.h>
#define LL long long
using namespace std;
 
int T;
LL n;
 
int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%lld",&n);
        LL ans=0;
        for(LL i=3;i*i<=2*n-1;i+=2) ans++;
        printf("%lld\n",ans);
    }
}

\(O(1)\)

#include<bits/stdc++.h>
#define LL long long
using namespace std;

int T;
LL n;

int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%lld",&n);
        LL ans=(sqrt(2*n-1)+1)/2-1;
        printf("%lld\n",ans);
    }
}

E

F

G

posted @ 2021-02-17 23:32  fxq1304  阅读(7)  评论(0编辑  收藏  举报