福州大学第十五届程序设计竞赛(部分题解)

要是有什么大佬为了看一些好题的点进来的,真不好意思。。。本人实力不咋滴。只能写写水题的题解。

其实还有几题是学长教我的,不然我都不会做。

A、24

有一天dark sil在玩24点,被杰哥看见了,杰哥就想到了这样一个问题:假设有N张卡片,上面写着1,2,3....N,是否可以用这些卡片组成24点呢?要求是只能使用加减乘除(整除),所有的卡片都必须用上,并且只能使用一次。如果可以组成24点,则输出"Yes",否则输出“No”.

假设N等于5,那么存在1*2*(3+4+5)=24.

示例还有4            1×2×3×4=24;

后来你就会发现         6.......   1+2×3×4+5-6=24            7........1+2×(3+4+5)+6-7=24        

大于等于4的都能构成这样形式的。

#include<stdio.h>
int main()
{
    int T;
    while(~scanf("%d",&T)){
        while(T--){
            int n;
            scanf("%d",&n);
            if(n>=4){
                printf("Yes\n");
            }else{
                printf("No\n");
            }
        }
    }
    return 0;
}

B、简单的模板题:bfs

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
int n;
char a[1005][1005];
int vis[1005][1005];
int dir[4][2]={
    {-1,0},
{0,-1},{0,1}
    ,{1,0}
};
typedef struct point{
    int x,y,step;
}p;
int sx,sy,fx,fy;
int main()
{
        while(~scanf("%d",&n)){
            memset(a,'\0',sizeof(a));
            memset(vis,0,sizeof(vis));
            for(int i=0;i<n;i++){
                scanf("%s",a[i]);
            }
            for(int i=0;i<n;i++){
                for(int j=0;j<n;j++){
                    if(a[i][j]=='S'){
                        sx=i,sy=j;
                    }else if(a[i][j]=='E'){
                        fx=i,fy=j;
                    }else if(a[i][j]=='#'){
                        vis[i][j]=1;
                    }
                }
            }
            queue<p>Q;
            p u,v;
            p first={sx,sy,0};
            int flag=1;
            for(Q.push(first);!Q.empty();Q.pop()){
                u=Q.front();
                if(a[u.x][u.y]=='E'){
                    flag=0;
                    printf("%d\n",u.step);
                    break;
                }
                for(int i=0;i<4;i++){
                    v.x=u.x+dir[i][0];
                    v.y=u.y+dir[i][1];
                    v.step=u.step+1;
                    if(0<=v.x&&v.x<n&&0<=v.y&&v.y<n&&vis[v.x][v.y]==0&&vis[v.x][v.y]!='#'){
                            vis[v.x][v.y]=1;
                            Q.push(v);
                    }
                }
            }
            if(flag){
                printf("-1\n");
            }
        }
        return 0;
}

C、走路遇怪兽问题,这题就是枚举每一个点就可以了,不过算速度需要一点想法,

因为sqrt再取ceil的确没错。

但是     距离=时间×速度,距离的平方=(时间×速度)的二次方

直接用来比较即可:距离的平方<=(时间×速度)的二次方

#include<stdio.h>
#include<string.h>
int dis(int x1,int y1,int x2,int y2){
    return ((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
typedef struct point{
    int x,y,v;
}node;
int vis[100050]={0};
int main()
{
    int n,i,j;
    while(scanf("%d",&n)!=EOF){
        int ans=0;
        node a[100500];
        for(i=0;i<n;i++){
            scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].v);
        }
        memset(vis,0,sizeof(vis));
        for(i=1;i<=100;i++){
            for(j=0;j<n;j++){
                if( dis(a[j].x,a[j].y,0,i)<=a[j].v*a[j].v*i*i  &&   vis[j]==0  ){
                    ans++;
                    vis[j]=1;
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

D、这题是问学长才知道的,学长说,其实找出一个拥有前面数字的最大值即可,可以看看代码实现

#include<stdio.h>
#define max(a,b) (a)>(b)?(a):(b)
int main()
{
    int n;
    int a[100005];
    while(~scanf("%d",&n)){
        int vis[100050]={0},i;
        for(i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        int maxz=-1;
        for(i=1;i<=n;i++){
            vis[a[i]]=vis[a[i]-1]+1;
            maxz=max(maxz,vis[a[i]]);
        }
        printf("%d\n",n-maxz);
    }
    return 0;
}

H、排序,-这题都是坑,原以为排完序就可以了,后来才知道要排序后的第一个  a[i]>a[i+1]的下标。

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
    int n;
    while(~scanf("%d",&n)){
        int a[100400],o[100400],e[100400],i,on=0,en=0;
        memset(o,127,sizeof(o));
        memset(e,127,sizeof(e));
        for(i=1;i<=n;i++){
            if(i&1){
                scanf("%d",&o[on++]);
                //cout<<"****"<<endl;
            }else{
                scanf("%d",&e[en++]);
                //cout<<"####"<<endl;
            }
        }
        sort(o,o+on);
        sort(e,e+en);
        for(i=1;i<=n;i++){
            if(i&1){
                if(o[i/2]>e[i/2]){
                    printf("%d\n",i);break;
                }
            }else{
                if(e[i/2-1]>o[i/2]){
                    printf("%d\n",i);break;
                }
            }
            //printf("%d%c",((i%2==1)?o[i/2]:e[i/2-1]),i==n?'\n':' ');
        }
        if(i==n+1){
            printf("OK\n");
        }
    }return 0;
}


猜你喜欢

转载自blog.csdn.net/z_sea/article/details/80317566