Educational Codeforces Round 104 (Rated for Div. 2)(A~D)

Educational Codeforces Round 104 (Rated for Div. 2)

A. Arena

签到题,直接看看多少个数比最小的数大就好了。

#include<bits/stdc++.h>
#define ll long long int 
#define mem(a,b) memset(a,b,sizeof)
using namespace std;
int a[10010];
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
        }
        sort(a+1,a+1+n);
        int ans = 0;
        for(int i=1;i<=n;i++)
        {
            if(a[i]==a[1]) ans++;
        }
        cout<<n-ans<<endl;
    }
    return 0;
}

B. Cat Cycle

题意:A,B两猫跳格子,A是从n,n-1,n-2,n-3,.....,2,1次序循环跳,而B从1开始1,2,。。。。n-1,n跳,但是他们不能共用一个格子,因为A比较大,所以只能B跳那个格子的下一个,即如果都要跳到第i个那么A在第i个,而B去了i+1个,问第k分钟B在哪。

题解,你可以发现当格子个数为偶数个时永远不会公用一个格子,奇数个时,你每跳n/2个格子的时候他就要多跳1格,然后求出总共会跳几轮就好了。

#include<bits/stdc++.h>
#define ll long long int 
#define mem(a,b) memset(a,b,sizeof)
using namespace std;
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        ll n,k;
        cin>>n>>k;
        ll pp = k%n;
        if(n%2==0)
        {
            ll xx = pp==0?n:pp;
            cout<<xx<<endl;
        }
        else{
            ll xx = n/2;
            ll yy = k/xx;
            //cout<<pp<<endl;
            if(k%xx==0) yy--;
            //cout<<xx<<" "<<yy<<endl;
            int pos = pp==0?n:pp;
            int poss = ((pos+yy)%n)==0? n:(pos+yy)%n;
            cout<<poss<<endl;
        }
    }
    return 0;
}

C. Minimum Ties

题意:有n只队伍互相踢比赛,若a和b踢,a如果赢了加3分,平了加1分,输了不加分。他们互相不重复踢(n-1)*n/2场比赛,问他们如何出现比赛使所有队比赛积分相同,且平局最少。

题解:分情况讨论,当n为奇数时,每支队踢赢一半输一半就好,用1和-1矩阵的值来构造就好,当n为偶数时,那么我们就每个人多一场比赛是平局,其余一半输一半赢,来继续构造一个矩阵就好了。

#include<bits/stdc++.h>
#define ll long long int 
#define mem(a,b) memset(a,b,sizeof a)
using namespace std;
int a[110][110];
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(i == j) a[i][j] = 0;
                else
                a[i][j] = 1;
            }
        }
        if(n%2){
            for(int i=1;i<=n;i++)
        {
            int ans = 0;
            for(int j=1;j<=n;j++)
            {
                if(i!=j) ans+=a[i][j];
            }
            int flag = 1;
            if(ans) flag = -1;
            if(n%2)
            {
                for(int j=n;j>=1;j--)
                {
                    if(ans==0) break;
                    a[i][j] = flag;
                    a[j][i] = -flag;
                    ans += 2*flag;
                    
                }
                for(int j=n;j>=1;j--)
                {
                    a[j][i] = -a[i][j];
                }
            }
            else{
                if(ans>0) ans--;
                else if(ans<0) ans++;
                a[n][i] = 0;
                a[i][n] = 0;
                for(int j=n-1;j>=1;j--)
                {
                    if(ans==0) break;
                    a[i][j] = flag;
                    a[j][i] = -flag;
                    ans += 2*flag;
                    
                }
                for(int j=n;j>=1;j--)
                {
                    a[j][i] = -a[i][j];
                }
            }
        }
        }
        else{
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n-i;j++){
                    if(j==n/2)
                    {
                        a[i][i+j] = 0;
                    }
                    else if(j>n/2)
                    {
                        a[i][i+j] = -1;
                    }
                    else a[i][i+j] = 1;
                }
            }
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=i+1;j<=n;j++)
            {
                cout<<a[i][j]<<" ";
            }
        }
        cout<<endl;
        
    }
    return 0;
}

D. Pythagorean Triples

题意:问在n范围内有多少组(a,b,c)满组勾股定理和
c=a2−b,1abcn

题解:你可以多列几个找到规律当a为奇数时它必存在同时满组这两公式的组,而偶数不存在,(3,4,5),(5,12,13),(7,24,25)所以我只要统计一下在n之内

有多少(i*i+1)/2<=n的i的数就好了。

#include<bits/stdc++.h>
#define ll long long int 
#define mem(a,b) memset(a,b,sizeof a)
using namespace std;
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        ll n; 
        cin>>n;
        n*=2;
        n--; 
        int x = sqrt(n);x--;
        cout<<x/2<<endl;
    }
    return 0;
}

属实打的太菜了。。。。。

原文地址:https://www.cnblogs.com/lcsdsg/p/14405985.html