20180523 -周中训练1

A.Odd Palindrome

题意:

一组字符串,倘若每个回文串均是偶数,则输出“Or not.",否则输出“Odd.‘’

思路:

暴力枚举即可。

代码:

#include <bits/stdc++.h>
using namespace std;
char s[105];
int main()
{
    bool flag;
    cin>>s;
    int len =strlen(s);
    for(int i=1;i<=len-1;i++)
    {
        for(int j=0;j<=i;j++)
        {
            flag=1;
            for(int k=0;k<=(i-j)/2;k++)
            {
                if(s[i-k]!=s[j+k])
                {
                    flag=0;
                    break;
                }
            }
            if(flag==1)
            {
                int leng = i-j+1;
                if(leng%2==0)
                {
                    cout<<"Or not."<<endl;
                    return 0;
                }
            }
        }
    }
    cout<<"Odd."<<endl;
    return 0;
}

B.Latin Squares

题意:

有一个n*n的方阵,其中A-Z代表10到35,如果这个方阵中的每一行每一列元素均不相同,则称为Latin Squares,若不是,则输出“No”,若是,然后看第一行第一列是否是递增的序列,若是则输出“Reduced”否则输出“Not Reduced”。

思路:

将字符全部转换为数字,暴力枚举即可。

代码:

#include <bits/stdc++.h>
using namespace std;
char s[41][41];
int num[41][41];
int vis[50];
int n;
int main()
{
    while(cin>>n)  //注意是多组输入
    {
    int flag=0;
    memset(vis,0,sizeof(vis));
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            cin>>s[i][j];
            if(s[i][j]<='9'&&s[i][j]>='0')
            {
                num[i][j]=s[i][j]-'0';
            }
            else
            {
                num[i][j]=s[i][j]-'A'+10;
            }
        }
    }
    for(int i=0;i<n;i++) ///hang
    {
        memset(vis,0,sizeof(vis));
        for(int j=0;j<n;j++)  ///lie
        {
            if(vis[num[i][j]]==0)
            {
                vis[num[i][j]]++;
            }
            else
            {
                flag=1;
                break;
            }
        }
    }
    if(flag==1)
    {
        cout<<"No"<<endl;
        continue;
    }
    for(int i=0;i<n;i++) ///lie
    {
        memset(vis,0,sizeof(vis));
        for(int j=0;j<n;j++)  ///hang
        {
            if(vis[num[j][i]]==0)
            {
                vis[num[j][i]]++;
            }
            else
            {
                flag=1;
                break;
            }
        }
    }
    if(flag==1)
    {
        cout<<"No"<<endl;
        continue;
    }
    for(int i=1;i<n;i++)   ///diyihang
    {
        if(num[0][i-1]>=num[0][i])
        {
            flag=2;
            break;
        }
    }
    if(flag==2)
    {
       cout<<"Not Reduced"<<endl;
       continue;
    }

    for(int i=1;i<n;i++)   ///diyilie
    {
        if(num[i-1][0]>=num[i][0])
        {
            flag=2;
            break;
        }
    }
     if(flag==2)
    {
       cout<<"Not Reduced"<<endl;
       continue;
    }
    if(flag==0)
    cout<<"Reduced"<<endl;
    }
    return 0;
}

C.

题意:

给定n,从1开始,让1与2、3、4、。。。n进行比较,此时输出的结果是1,然后在让2与3、4、5...n进行比较,此时输出2,注意每两个数字只能比较一次,问总共比较一半次数时,输出那个数字?

代码:

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

int main()
{
    ll n,sum,i,j,res;
    cin>>n;
    sum=(n-1)*n/2;//总共比较次数
    sum=(sum+1)/2; //总共比较次数的一半,注意这种情况
    for(i=n-1,j=1;j<n;j++,i--)
    {
        res+=i;
        if(res>=sum) //大于一半时
        {
            cout<<j<<endl;
            break;
        }
    }
   return 0;
}

I.Forbidden Zero

题意:

给你一个不包含数字0得数,问你下一个不包含0的数字是多少?

思路:

0用1替换即可

代码:

#include <bits/stdc++.h>
using namespace std;
char s[10];
int b[10];

int solve(int x)
{
    int cnt=0;
    while(x)
    {
        b[cnt++]=x%10;
        x/=10;
    }
    for(int i=0;i<cnt;i++)
    {
        if(b[i]==0)
        {
            s[i]='1';
        }
        else s[i]=b[i]+'0';
    }
    return cnt;
}

int main()
{
    int n;
    scanf("%d",&n);
    n++;
    int l=solve(n);
    for(int i=l-1;i>=0;i--)
    {
        printf("%c",s[i]);
    }
    printf("\n");
    return 0;
}

  • 什么

猜你喜欢

转载自blog.csdn.net/sinat_37668729/article/details/80427913