JXNU_Weekly_competition3题解

1001大壕哥的字符串
题解:检查字符串是否为回文,记录不同位点个数。如果字符串不是回文,且不同位点数为1,输出YES;如果不同位点数为0(也就是回文串)且串长度为奇数(可以改变最中间的那个),则输出YES;否则,输出NO。

#include<cstdio>
#include<cstring>
using namespace std;

int main()
{
    char s[105];
    while(~scanf("%s",s))
    {
        int len=strlen(s);
        int ans=0;
        for(int i=0;i<=(len-1)/2;i++)
            if(s[i]!=s[len-i-1])
            ans++;
        if(ans==1||(ans==0&&len%2==1))
            puts("YES");
        else puts("NO");
    }
    return 0;
}

1002:大壕哥与蛇
题解:略

 #include<iostream>
#include<string>
#include<cstdio>
using namespace std;

int main()
{

    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        int cnt=1;
        int i;
        for(i=1;i<=n;i++)
        {
            if(i%2)
            {
                for(int j=0;j<m;j++)
                {
                    if(j)putchar(' ');
                    printf("%d",cnt+j);
                }
            }
            else
            {
                cnt+=2*m-1;
                for(int j=0;j<m;j++)
                {
                    if(j)putchar(' ');
                    printf("%d",cnt-j);
                }
                cnt++;
            }
            puts("");
        }
    }
    return 0;
}

1003 大壕哥的数学之旅1

这里给出递归写法:

#include <stdio.h>

void F(int x, int n)
{
    char flag;
    if (x == n)
    {
        printf("cos(%d)", n);
        return;
    }
    flag = x % 2 ? '-' : '+';

    printf("cos(%d%c", x, flag);
    F(x + 1, n);
    printf(")");

}

int main()
{
    int n;
    while (scanf("%d", &n) != EOF)
    {
        if (n == 0)
            return 0;
        F(1, n);
        printf("\n");
    }

    return 0;
}

1004
递归写法

#include <stdio.h>

void F(int x, int n)
{
    char flag;
    if (x == n)
    {
        printf("cos(%d)", n);
        return;
    }
    flag = x % 2 ? '-' : '+';

    printf("cos(%d%c", x, flag);
    F(x + 1, n);
    printf(")");

}

void A(int n)
{
    F(1, n);
}

void S(int x, int n)
{
    if (x == 1)
    {
        A(x);
        printf("+%d", n - x + 1);
        return;
    }
    printf("(");
    S(x - 1, n);
    printf(")");
    A(x);
    printf("+%d", n - x + 1);
}

int main()
{
    int n;
    while (scanf("%d", &n) != EOF)
    {
        if (n == 0)
            return 0;
        S(n, n);
        printf("\n");
    }

    return 0;
}

1005大壕哥找w
二分查找
代码

#include<stdio.h>
#include<stdlib.h>
#define maxn 10000000
int v[maxn];
int n,w;
int findw()
{
    int l,r,mid;
    l=1;
    r=n;
    while(l+1<r)
    {
        mid=(l+r)/2;
        if(v[mid]<=w)
        {
            l=mid;
        }
        else
            r=mid;
    }
    if(v[r]==w)
        return r;
    if(v[l]==w)
        return l;
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
       int i;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&v[i]);
        }
        scanf("%d",&w);
        int ans;
        ans=findw();
        printf("%d\n",ans);
    }
    return 0;
}

1006大壕哥的party
题解:
二分解法:预处理出每堆的上界二分查找答案。

#include<stdio.h>
#include<string.h>
int a[100100];
int b[100100];

int find(int num,int a[],int n)
{
    int l,r,m;
    l=0,r=n;
    while(l<=r)
    {
        m=(l+r)/2;
        if(a[m]<num)
            l=m+1;
        else if(a[m]>num)
            r=m-1;
        else
            return m;
    }
    return l;
}
int main()
{
    int n;
    int i,m,num;
    while(scanf("%d",&n)!=EOF)
    {
        int cnt=0;
        b[cnt++]=0;
        for(i=0; i<n; i++)
        {
            scanf("%d",&a[i]);
            b[cnt]=b[cnt-1]+a[i];
            cnt++;
        }
        scanf("%d",&m);
        for(i=0; i<m; i++)
        {
            scanf("%d",&num);
            int ans=find(num,b,n);
            printf("%d\n",ans);
        }
    }
    return 0;
}

法二:用一个数组标记记录,比如[3,9]是第二段,让a[3]=2,a[4]=2,a[5]=2,…a[8]=,a[9]=2.这样给定一个数m,只要求出a[m]的值就知道它在哪一段了。

代码:

#include<cstdio>
int s[1000010];
using namespace std;
int main()
{
    int n,t,a=1,k=1,m;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&t);
        for(int j=a;j<t+a;j++)
            s[j]=k;
            a+=t;
        k++;


    }
    scanf("%d",&m);
    for(int i=0;i<m;i++)
    {
        scanf("%d",&t);
        printf("%d\n",s[t]);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/reallsp/article/details/78633237