zoukankan      html  css  js  c++  java
  • 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;
    }

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

  • 相关阅读:
    fiber
    ACM用到的算法。先做个笔记,记一下
    matlab安装及破解
    银行家算法
    网络安全(超级详细)零基础带你一步一步走进缓冲区溢出漏洞和shellcode编写!
    心脏滴血漏洞复现(CVE-2014-0160)
    KMP算法分析
    利用BURPSUITE检测CSRF漏洞
    BURPSUITE爆破密码
    动态规划—最长回文子串LEETCODE第5题深度剖析
  • 原文地址:https://www.cnblogs.com/lcsdsg/p/14405985.html
Copyright © 2011-2022 走看看