第二届新生赛部分题目总结

  1. A在这里插入图片描述
#include<stdio.h>//这个题主要是结构体排序,用冒泡会超时,只能快排,桶排之类的,个人感觉快排挺不错 
typedef struct _XI{//定义一个结构体存数据,做完发现有点傻了,可以直接用结构体赋值来,没必要设置一个指针来搞事情,唉 
	char *p;//指向名字 
	int v;//存成绩 
	char ch[105];//存名字 
}XI;
void Qs(XI* x,int low,int high);
int main()
{
	int n;
	scanf("%d",&n);
	XI x[n];
	int i,j;
	for(i=0;i<n;i++){
		scanf("%s%d",x[i].ch,&(x[i].v));//存数据 
		x[i].p=x[i].ch;
	}
	Qs(x,0,n-1);
	for(i=0;i<n;i++){
		printf("%s ",x[i].p);
	}
}
void Qs(XI* x,int low,int high)
{
	int i=low;
	int j=high;
	int key=x[low].v;
	char *k=x[low].p;
	if(low>=high){
		return;
	}
	while(low<high){
		for(;low<high&&key<=x[high].v;high--);
		if(key>x[high].v){
			x[low].v=x[high].v;
			x[low].p=x[high].p;
		}
		for(;low<high&&key>=x[low].v;low++);
		if(key<x[low].v){
			x[high].v=x[low].v;
			x[high].p=x[low].p;
		}
	}
	x[low].v=key;
	x[low].p=k;
	Qs(x,i,low-1);
	Qs(x,low+1,j);
}
  1. C
    在这里插入图片描述
#include<stdio.h>//这个题的数据都很大,不用long long很容易炸 
long long a[1020][1020];//先把数组定义好 
long long dp[1020][1020];
int main()
{
	long long n,m;
	scanf("%lld%lld",&n,&m);
	long long i,j,k;
	for(i=1;i<n+1;i++){
		for(j=1;j<m+1;j++){
			scanf("%lld",&a[i][j]);//填充一下初始数据 
		}
	}
	
	for(i=0;i<n+1;i++){//清空dp数组的行和列 
		dp[i][0]=0;
	}
	for(i=0;i<m+1;i++){
		dp[0][i]=0;
	}
	
	for(i=1;i<=n;i++){//填充dp数组 
		for(j=1;j<=m;j++){
			dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+a[i][j];
		}
	}
	long long q;//读取测试次数 
	scanf("%lld",&q);
	long long num[q];//存储测试结果 
	for(i=0;i<q;i++){
		long long pt1[4];
		long long pt2[4];
		long long x1,y1,x2,y2,x3,y3,x4,y4;
		long long sum1,sum2,sum3;
		scanf("%lld%lld%lld%lld%lld%lld%lld%lld",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
		pt1[0]=x1;pt1[1]=x2;pt1[2]=x3;pt1[3]=x4;//存所有的横坐标 
		pt2[0]=y1;pt2[1]=y2;pt2[2]=y3;pt2[3]=y4;//存所有的纵坐标 
		sum1=dp[x2][y2]-dp[x2][y1-1]-dp[x1-1][y2]+dp[x1-1][y1-1];//第一个矩形的和 
		sum2=dp[x4][y4]-dp[x4][y3-1]-dp[x3-1][y4]+dp[x3-1][y3-1];//第二个矩形的和 
		sum3=sum1+sum2;//总和 
		if(x3>x2||x1>x4||y3>y2||y1>y4){//如果矩形分开,就不用减 
			
		}else{//如果有重叠就要减 
			for(j=0;j<3;j++){//给横纵坐标排序 
				for(k=0;k<4-j-1;k++){
					if(pt1[k]>pt1[k+1]){
						long long temp1=pt1[k];
						pt1[k]=pt1[k+1];
						pt1[k+1]=temp1;
					}
					if(pt2[k]>pt2[k+1]){
						long long temp2=pt2[k];
						pt2[k]=pt2[k+1];
						pt2[k+1]=temp2;
					}
				}
			}
			long long x_1=pt1[1],x_2=pt1[2];//取中间两个坐标确定需要减去的矩形
			long long y_1=pt2[1],y_2=pt2[2];
			long long sum4=dp[x_2][y_2]-dp[x_2][y_1-1]-dp[x_1-1][y_2]+dp[x_1-1][y_1-1];//需要减去的矩形 
			sum3=sum3-sum4;//减去矩形 
		}
		num[i]=sum3;//储存测试数据 
	}
	for(i=0;i<q;i++){
		printf("%lld\n",num[i]);//输出数据 
	}
	return 0;
}
  1. I
    在这里插入图片描述
#include<stdio.h>
int main()//因为只要被叫奇数次就会站起来,如果是平方数A=a*a,则在a左边和右边 x1*x2=A 相互抵消,只有a孤单一人构成奇数 
{
	long long n;
	scanf("%lld",&n);
	long long i=1;
	for(i=1;i*i<=n;i++){
		printf("%lld ",i*i);
	}
	return 0;
}
  1. J
    在这里插入图片描述
#include<stdio.h>//先快排排序,应该用结构体的,唉,懒的改了 
void Qs(int(*num)[2],int low,int high)
{
	if(low>=high){
		return;
	}
	int i=low;
	int j=high;
	int key1=num[low][1];
	int key2=num[low][0];
	while(low<high){
		for(;low<high&&key1<=num[high][1];high--);
		if(key1>num[high][1]){
			num[low][1]=num[high][1];
			num[low][0]=num[high][0];
		}
		for(;low<high&&key1>=num[low][1];low++);
		if(key1<num[low][1]){
			num[high][1]=num[low][1];
			num[high][0]=num[low][0];
		}
	}
	num[low][1]=key1;
	num[low][0]=key2;
	Qs(num,low+1,j);
	Qs(num,i,low-1);
}
int main()
{
	int n;
	scanf("%d",&n);
	int num[n][2];
	int i,j;
	for(i=0;i<n;i++){
		scanf("%d%d",&num[i][0],&num[i][1]);//读数据 
	} 
	Qs(num,0,n-1);//按照结束时间从小到大排完序 
	int a=num[0][1],count=1;//判定条件是下一个的起始时间要大于等于上一个的结束时间,而且最少也有一个题通过 
	for(i=0;i<n-1;i++){
		if(num[i+1][0]>=a){//条件成立了就计入 
			count++;
			a=num[i+1][1];//更新判定条件 
		}
	}
	printf("%d",count);
	return 0;
 } 
  1. K
    在这里插入图片描述
#include<stdio.h>//因为冒泡排序的最坏情况就是交换(n-1)*n/2次,所以只要不是全部都是反着的就YES 
int main()
{
	int t;
	scanf("%d",&t);
	int i,j;
	int num[t];
	for(i=0;i<t;i++){
		int n;
		scanf("%d",&n);
		int max=(n-1)*n/2-1;
		int x[n];
		int count=0;
		for(j=0;j<n;j++){
			scanf("%d",&x[j]);
			if(j>0&&x[j]<x[j-1]){
				count++;
			}
		}
		if(count==n-1){
			num[i]=0;
		}else{
			num[i]=1;
		}
	}
	for(i=0;i<t;i++){
		if(num[i]){
			printf("YES\n");
		}else{
			printf("NO\n");
		}
	}
	return 0;
}
  1. L
    在这里插入图片描述
#include<stdio.h>//异或运算,记住用long long 
int main()
{	
	int n;
	scanf("%d",&n);
	int i;
	long long num[1010]={0};
	for(i=0;i<n;i++){
		scanf("%lld",&num[i]);
	}
	long long sum=num[0];
	for(i=0;i<n-1;i++){
		sum=sum^num[i+1];
	}
	printf("%lld",sum);
	return 0;
}
// 如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
// 0异或任何数=任何数
// 1异或任何数->任何数取反 
  1. M
    在这里插入图片描述
#include<stdio.h>
int main()
{
	int t;
	scanf("%d",&t);
	int i,j;
	int num[t];
	for(i=0;i<t;i++){
		int n,k;
		scanf("%d%d",&n,&k);
		if(k>=n){
			num[i]=k-n;//就是A点只有往右走(k-n)下才能到理论位置 
		}else{
			num[i]=(n-k)%2;//在左边就只要满足(n-k)是偶数,它中点就是B点 
		}
	}
	for(i=0;i<t;i++){
		printf("%d\n",num[i]);
	}
	return 0;
 } 
  1. F
    在这里插入图片描述
#include<stdio.h>
int main()
{
	printf("Win");
	return 0;
 } 

这道题实在不太会,希望有大佬能讲解下,谢谢了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值