HNCU程序设计周赛(1)题解

admin 发布于 2024-11-03 1052 字 589 次阅读


因为是第一场周赛题目难度并没有拉得高;

下次必须狠狠地加难度

A.Hello World

#include<stdio.h>

int main(){
    puts("I Love nowcoder");//直接复制粘贴输出就好了
}

B.简单电梯房

#include<stdio.h>

int main(){
    int x,y;
    scanf("%d%d",&x,&y);
    if(x>y){
        if(x-y>3)puts("NO");//判断一下y是否比x低三层
        else puts("YES");
    }
    else {
        if(y-x>2)puts("NO");//判断一下y是否比x高二层
        else puts("YES");
    }
}

C.刻度尺

#include<stdio.h>
 
int main(){
    int n;
    scanf("%d",&n);
    printf("%d",(n%5>=3)?n-(n%5)+5:n-(n%5));
//比较一下该点的上一个刻度和下一个刻度,哪个近就输出哪个
}

D.恐怖袭击

#include<stdio.h>
 
void solve(){
    int a,b,c;
    scanf("%d%d%d",&a,&b,&c);
    puts(b-c<=a?"YES":"NO");//判断一下b减去a是否小于等于c
}
 
int main(){
    int t;
    scanf("%d",&t);
    while(t--)solve();//注意有多样例
}

E.x?

#include<stdio.h>
using namespace std;//本题就是考察n是否能通过只除以2和3除尽

int main(){
    int n;
    scanf("%d",&n);
    while(n%3==0)n/=3;//除以3到不能除为止
    while(n%2==0)n/=2;//除以2到不能除为止
    puts((n==1?"Yes":"No"));//如果等于1就是能除尽
}

F.冒泡排序?

#include<stdio.h>

int n,a[10000];

int main() {
    scanf("%d",&n);
    for(int i=0;i<n;i++)scanf("%d",&a[i]);
    for(int i=0;i<n;i++){//写个冒泡排序就行了
        for(int j=0;j<n-i-1;j++){
            if(a[j]>a[j+1]){
                int now=a[j];
                a[j]=a[j+1];
                a[j+1]=now;
            }
        }
    }
    for(int i=0;i<n;i++)printf("%d ",a[i]);
    return 0;
}

G.小陆学长的组合数学

本题考察杨辉三角形的运用(其实题面已经说明白了

#include<stdio.h>
typedef long long ll;

ll a[1100][1100];
const int mod=1e9+7;

int main(){
    int n;
	scanf("%d",&n);
	for (int i=1;i<=1000;i++){//先预处理出杨辉三角形
		a[i][i] = a[i][0] = 1;
		for (int j=1;j<i;j++)a[i][j]=(a[i-1][j-1]+a[i-1][j])%mod;
//注意数据量很大,要取模
	}
	for (int t=1;t<=n;t++){
		int i,j;
                scanf("%d%d",&i,&j);
		printf("%ld\n",a[i][j]);//直接回答就行了
	}
}

H.小陆学长的硬币

题面也提示了是一个贪心,

题目提示了只有一个B和一些A,那么整个字符串会被B分成两半。

选择子串AB,将其变为BC,

选择子串BA,将其变为CB,

将题目抽象化就变成了B可以吃掉两边的其中一个A,并挪到A的位置上,在原来的B的位置吐出一个C;

并且回去的路会被吐出的C拦住,所以当选择了一个方向后就不能后悔了;

所以正确解法应该是输出左右两边的A数量较多的那一边的A的个数;

#include<stdio.h>

char s[500005];

int main(){
    scanf("%s",s);
    int l=0,r=0;
    int flag=0;
    for(int i=0;s[i]!=NULL;i++){
        if(s[i]=='B')flag=1;
        if(flag==0&&s[i]=='A')l++;
        if(flag==1&&s[i]=='A')r++;
    }
    printf("%d",(l>=r?l:r));
}

I.压轴题(大概?)

本题考察前缀和的运用;

没啥别的,学过就会写;

大家尽量在下一次周赛前学一下差分和前缀和

#include<stdio.h>
typedef long long ll;

int a[100010];
ll pre[100010];

int main(){
    int n,m;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)pre[i]=pre[i-1]+a[i];
    scanf("%d",&m);
    for(int i=1;i<=m;i++){
        int l,r;
        scanf("%d%d",&l,&r);
        printf("%lld\n",pre[r]-pre[l-1]);
    }
    return 0;
}
最后更新于 2024-11-03