xdoj freshmen onsite 2017

回忆第一届新生赛,在前往icpc的途中和队友讨论如何出题“为难”新生,尔来已经两年的,不觉感慨时间飞逝。

OJ上没有挂对应题目的题面,可以从这下载,然后去oj提交

Problem A A + B problem

思路:1000以内特定三数和组合,直接暴力前两数统计即可

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

Problem B The C Programming Test

思路:小模拟:排序,去重,次大次小值均可在输入中处理掉,再按数大小二次循环统计出众数

#include <bits/stdc++.h>
 
using namespace std;
 
const int maxn = 1e3+10;
const int maxm = 1e4+10;
 
int a[maxn];
int num[maxm];
vector<int> B,D;
 
int main()
{
    int n,Cma1=-1,Cma2=-1,Cmi1=1e5,Cmi2=1e5,Dnum=0;
    scanf("%d",&n);
    memset(num,0,sizeof num);
    B.clear();
    D.clear();
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        if(a[i]>Cma1)
        {
            Cma2 = Cma1;
            Cma1 = a[i];
        }
        else if(a[i]>Cma2)  Cma2 = a[i];
         if(a[i]<Cmi1)
        {
            Cmi2 = Cmi1;
            Cmi1 = a[i];
        }
        else if(a[i]<Cmi2)  Cmi2 = a[i];
        num[a[i]]++;
        if(num[a[i]]==1)
            B.push_back(a[i]);
    }
 
    for(int i=0;i<1e4+2;i++)
    {
        if(num[i]>Dnum)
        {
            Dnum = num[i];
            D.clear();
            D.push_back(i);
        }
        else if(num[i]==Dnum)   D.push_back(i);
    }
 
    sort(a,a+n);
    for(int i=0;i<n-1;i++)    printf("%d ",a[i]);
    printf("%d\n",a[n-1]);
 
    int len = B.size();
    for(int i=0;i<len-1;i++)    printf("%d ",B[i]);
    printf("%d\n",B[len-1]);
 
    printf("%d %d\n",Cma2,Cmi2);
 
    int len2 = D.size();
    for(int i=0;i<len2-1;i++)    printf("%d ",D[i]);
    printf("%d\n",D[len2-1]);
 
    return 0;
}

Problem C Music List

思路:求多次区间扫描后的点排序,这题我确实是个很巧妙且很实用的方法,记得我第一次做到这种题型的时候也很喜欢,类似于信号系统中频域变换,记录变化点之后扫描累加。当然,一定要注意输出格式

#include <bits/stdc++.h>
 
using namespace std;
 
const int maxn = 1e5+10;
 
int k[maxn];
int re[maxn];
 
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    memset(k,0,sizeof k);
    for(int i=0;i<m;i++)    scanf("%d",&k[i]);
    sort(k,k+m,greater<int>());
    memset(re,0,sizeof re);
    int pos = 0;
    int now = 0;
    for(int i=1e5+1;i>0;i--)
    {
        while(i==k[pos])
        {
            now++;
            pos++;
        }
        re[i] = now;
    }
    for(int i=1;i<=n;i++)   printf("%d\n",re[i]);
    return 0;
}

Problem D Square Problem

思路:求平面内平行于坐标轴的正方形个数,于是暴力正方形对角线两点枚举计算即可

#include <bits/stdc++.h>
 
using namespace std;
 
const int maxn = 100+10;
 
bool m[maxn][maxn];
 
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        memset(m,false,sizeof m);
        int n;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            m[x][y] = true;
        }
        int sum = 0;
        for(int a=0;a<=99;a++)
        {
            for(int b=a+1;b<=100;b++)
            {
                int len = b-a;
                for(int c=0;c<=100-len;c++)
                    if(m[a][c]&&m[b][c]&&m[a][c+len]&&m[b][c+len])
                        sum++;
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}

1256: Roman Numbers

思路:看似复杂的罗马数字表示法,其实也有很细致的规律,那就是按位表示,互不干扰。想清楚这个道理之后,一切就都豁然开朗了,接下来模拟即可

#include <bits/stdc++.h>
 
using namespace std;
 
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int ne = n%1000;
        int p = n/1000;
        n = ne;
        for(int i=0;i<p;i++)    printf("M");
 
        ne = n%100;
        p = n/100;
        n = ne;
        if(p<=3)
            for(int i=0;i<p;i++)    printf("C");
        else if(p==4)   printf("CD");
        else if(p>=5&&p<=8)
        {
            printf("D");
            for(int i=5;i<p;i++)    printf("C");
        }
        else if(p==9)   printf("CM");
 
        ne = n%10;
        p = n/10;
        n = ne;
        if(p<=3)
            for(int i=0;i<p;i++)    printf("X");
        else if(p==4)   printf("XL");
        else if(p>=5&&p<=8)
        {
            printf("L");
            for(int i=5;i<p;i++)    printf("X");
        }
        else if(p==9)   printf("XC");
 
        p = n;
        if(p<=3)
            for(int i=0;i<p;i++)    printf("I");
        else if(p==4)   printf("IV");
        else if(p>=5&&p<=8)
        {
            printf("V");
            for(int i=5;i<p;i++)    printf("I");
        }
        else if(p==9)   printf("IX");
 
        printf("\n");
    }
    return 0;
}

Problem H Rubik’s Cube 

思路:判断一步操作还原魔方的可能性,那么直接模拟,一共只有六种转魔方的方式,判断每种转法完成后每种颜色是否位于同一面即可

#include <bits/stdc++.h>
 
using namespace std;
 
int a[24];
vector<int> num[6];
 
int main()
{
    for(int i=0;i<24;i++)   scanf("%d",&a[i]);
    bool ok = true;
    bool re = false;
 
    for(int check=0;check<6;check++)
    {
        //cout << "&" << check << "&" << endl;
        for(int i=0;i<6;i++)    num[i].clear();
        bool okk = true;
        if(check==0)
        {
            for(int i=0;i<24;i++)
            {
                if((i-0)*(i-1)*(i-17)*(i-19)*(i-10)*(i-11)*(i-12)*(i-14)!=0)
                    num[a[i]-1].push_back(i);
                else if(i==0)
                    num[a[i]-1].push_back(17);
                else if(i==1)
                    num[a[i]-1].push_back(19);
                else if(i==17)
                    num[a[i]-1].push_back(11);
                else if(i==19)
                    num[a[i]-1].push_back(10);
                else if(i==11)
                    num[a[i]-1].push_back(14);
                else if(i==10)
                    num[a[i]-1].push_back(12);
                else if(i==14)
                    num[a[i]-1].push_back(0);
                else if(i==12)
                    num[a[i]-1].push_back(1);
            }
        }
        else if(check==1)
        {
            for(int i=0;i<24;i++)
            {
                if((i-0)*(i-1)*(i-17)*(i-19)*(i-10)*(i-11)*(i-12)*(i-14)!=0)
                    num[a[i]-1].push_back(i);
                else if(i==0)
                    num[a[i]-1].push_back(14);
                else if(i==1)
                    num[a[i]-1].push_back(12);
                else if(i==17)
                    num[a[i]-1].push_back(0);
                else if(i==19)
                    num[a[i]-1].push_back(1);
                else if(i==11)
                    num[a[i]-1].push_back(17);
                else if(i==10)
                    num[a[i]-1].push_back(19);
                else if(i==14)
                    num[a[i]-1].push_back(11);
                else if(i==12)
                    num[a[i]-1].push_back(10);
            }
        }
        else if(check==2)
        {
            for(int i=0;i<24;i++)
            {
                if((i-0)*(i-2)*(i-4)*(i-6)*(i-8)*(i-10)*(i-21)*(i-23)!=0)
                    num[a[i]-1].push_back(i);
                else if(i==0)
                    num[a[i]-1].push_back(4);
                else if(i==2)
                    num[a[i]-1].push_back(6);
                else if(i==4)
                    num[a[i]-1].push_back(8);
                else if(i==6)
                    num[a[i]-1].push_back(23);
                else if(i==8)
                    num[a[i]-1].push_back(21);
                else if(i==10)
                    num[a[i]-1].push_back(12);
                else if(i==21)
                    num[a[i]-1].push_back(2);
                else if(i==23)
                    num[a[i]-1].push_back(0);
            }
        }
        else if(check==3)
        {
            for(int i=0;i<24;i++)
            {
                if((i-0)*(i-2)*(i-4)*(i-6)*(i-8)*(i-10)*(i-21)*(i-23)!=0)
                    num[a[i]-1].push_back(i);
                else if(i==0)
                    num[a[i]-1].push_back(23);
                else if(i==2)
                    num[a[i]-1].push_back(21);
                else if(i==4)
                    num[a[i]-1].push_back(0);
                else if(i==6)
                    num[a[i]-1].push_back(2);
                else if(i==8)
                    num[a[i]-1].push_back(4);
                else if(i==10)
                    num[a[i]-1].push_back(6);
                else if(i==21)
                    num[a[i]-1].push_back(10);
                else if(i==23)
                    num[a[i]-1].push_back(8);
            }
        }
        else if(check==4)
        {
            for(int i=0;i<24;i++)
            {
                if((i-4)*(i-5)*(i-16)*(i-17)*(i-20)*(i-21)*(i-12)*(i-13)!=0)
                    num[a[i]-1].push_back(i);
                else if(i==4)
                    num[a[i]-1].push_back(16);
                else if(i==5)
                    num[a[i]-1].push_back(17);
                else if(i==16)
                    num[a[i]-1].push_back(20);
                else if(i==17)
                    num[a[i]-1].push_back(21);
                else if(i==20)
                    num[a[i]-1].push_back(12);
                else if(i==21)
                    num[a[i]-1].push_back(13);
                else if(i==12)
                    num[a[i]-1].push_back(4);
                else if(i==13)
                    num[a[i]-1].push_back(5);
            }
        }
        else if(check==5)
        {
            for(int i=0;i<24;i++)
            {
                if((i-4)*(i-5)*(i-16)*(i-17)*(i-20)*(i-21)*(i-12)*(i-13)!=0)
                    num[a[i]-1].push_back(i);
                else if(i==4)
                    num[a[i]-1].push_back(12);
                else if(i==5)
                    num[a[i]-1].push_back(13);
                else if(i==16)
                    num[a[i]-1].push_back(4);
                else if(i==17)
                    num[a[i]-1].push_back(5);
                else if(i==20)
                    num[a[i]-1].push_back(16);
                else if(i==21)
                    num[a[i]-1].push_back(17);
                else if(i==12)
                    num[a[i]-1].push_back(20);
                else if(i==13)
                    num[a[i]-1].push_back(21);
            }
        }
       // for(int i=0;i<6;i++)
       //     printf("%d/",num[i].size());
 
        for(int i=0;okk&&i<6;i++)
            if(num[i].size()!=4)
                okk = false;
        for(int i=0;okk&&i<6;i++)
        {
            int pos = num[i][0]/4;
            //cout << num[i][0] << "*";
            for(int j=1;ok&&j<4;j++)
            {
                if((num[i][j]/4)!=pos)
                        okk = false;
                //cout << num[i][j] << "*";
            }
        }
        //cout << okk << endl;
        if(okk) re = true;
    }
 
    if(ok&&re)
        printf("YES\n");
    else
        printf("NO\n");
    return 0;
}
发布了97 篇原创文章 · 获赞 89 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Owen_Q/article/details/100548360
今日推荐