选拔赛 习题报告

本文探讨了两道编程挑战,涉及寻找独特花朵的算法和蛇形数字填充问题。第一题中,蒲煜凡学长试图找到一朵特别的花,通过比较花瓣数并进行排序、去重,最终确定是否能找到唯一一朵。第二题则介绍了蛇形数字的填充规律,通过二维数组存储并按特定顺序输出。这两道题目都需要巧妙的算法思维和逻辑处理。
摘要由CSDN通过智能技术生成

题目描述
蒲煜凡学长最近迷上了一个漂亮的小学妹,他想送一朵特别的花给这个小学妹。
他现在有一把N朵漂亮的花,每多花都有a[i]个花瓣,如果有1朵花的花瓣数与其他任意一朵花的花瓣数之差等于2,那么他可以选择把这朵花扔掉,也可以选择丢弃。
请问经过若干次操作之后蒲煜凡学学长能找到唯一的一支特别的花送给小学妹吗?
输入描述:
第一行一个整数t(1<=t<=500)表示测试样例数
每个测试样例第一行一个整数n(1<=n<=1e4)表示花的数量,第二行n个整数ai表示花瓣数。
输出描述:
输出t行"YES"or"NO"
示例1
输入
1
4
2 4 6 8
输出
YES

示例2
输入
1
5
9 3 5 6 7
输出
NO

PYF:虽然说我要挑出来一朵非常特别的花,当然这朵花,我可以选择花瓣数最少的,我也可以选择花瓣书最多的,但是呜呜呜,上回我费了就九牛二虎之力挑了一个花瓣最少的给她,她生气了,那我这回就选花瓣数最多的吧!感谢zzx大佬!
假定我是李华,我挑了几个问题:
1.为什么要去重?
首先呢 如果有重复的花朵
比如 2 4 4 4 4 6 那么重复的花朵是等价的(因为只留下来一个,就需要把所有重复元素都删去,要不然PYF学长没法挑了),因此需要去重。
2.你是如何做到确定你能不能挑出来?
落实在这一点:最特殊的一朵花朵!那么我先确定一个花瓣数最多的花朵,如果你能从剩下的花朵中再选出来花的话,那么我就没有办法选择了,我把去重以后的花朵都标记为1,我让我比我手上这朵花(花瓣数最多)花瓣少二的花朵,我就准备扔掉(数组定义为0),让其他花朵也是这样的,现在我手里编号为1的花朵,就是我想要留的,但是我已经选中一个花瓣数最多的花朵,那么我手里如果还有编号为1的花朵的话,我就没有办法选择了,所以就这样判断出来了嘿嘿嘿。
其实我感觉如果你输出yes的话,那么每一朵花都是特殊的花朵!

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int a[100000];
int b[100000];
int main(){
	int n;
	scanf("%d",&n);
	while(n--){
		int t;
		memset(b,0,sizeof(b));
		scanf("%d",&t);
		int r=0;
		for(int i=0;i<t;i++)	scanf("%d",&a[i]);
		if(t==1) printf("YES\n");
		else{
		sort(a,a+t);
		b[a[r]]=1;
		for(int i=1;i<t;i++){
			if(a[r]!=a[i]){
				r++;
				a[r]=a[i];//这是去重的过程(所有重复的元素在符合条件的情况下都是可消除的!) 
				b[a[r]]=1;			}
		}
		if(r==0) printf("NO\n");
		else{
		int ans=0;
		for(int i=1;i<=r;i++){
			b[a[i]-2]=0;//我按照我想要朵数最多的花朵,因此我已经保留了a[r]这朵花
			//如果还有其他的花等于1的话,那么我就输出NO 
		} 
		for(int i=0;i<r;i++){
			if(b[a[i]]!=0) ans++;
		} 
		if(ans) printf("NO\n");
		else printf("YES\n");
		}}
	}return 0;
}

大多数情况下甘靖学长说普通话时都很标准,但有时却令人抓狂,这件事困扰他很久了,突然有一天,他想通过读数字来纠正他的发音,
但是他不想按正常的顺序读数字,于是他按照某种规律写了一些数字在黑板上,比如如果他想数到9,那么他会把数字写成如下格式:
1 2 6 7
3 5 8
4 9
如果他想数到15,那么他会把数字写成如下格式:
1 2 6 7 15
3 5 8 14
4 9 13
10 12
11
他突然发现他写数字的规律是个蛇形,具体描述是这样的:
对于每一条左下-右上的斜线,从左上到右下依次编号1,2,…,2n-1;按编号从小到大的顺序,将数字从小到大填入各条斜线,其中编号为奇数的从左下向右上填写,编号为偶数的从右上到左下填写
输入描述:
输入一个不大于10000的正整数n,表示要填充到的数字的大小
输出描述:
按规律输出这些数字,相邻两个元素之间用单个空格间隔
示例1
输入
50
输出
1 2 6 7 15 16 28 29 45 46
3 5 8 14 17 27 30 44 47
4 9 13 18 26 31 43 48
10 12 19 25 32 42 49
11 20 24 33 41 50
21 23 34 40
22 35 39
36 38
37

这道题,据zzx聚聚的点拨,受到启发:可以先用一个二维数组,把这个东西用金字塔存起来我存的方法可能和别人的也不太一样
1
3 2
4 5 6
10 9 8 7
……
就这么存!
然后一列一列输出。(奇数列正序偶数列逆序)

#include<stdio.h>
int a[150][150];
int main(){
	int r=0;
	int p,t;
	int ju=0;
	scanf("%d",&p);
	for(int i=1;i<150;i++){
		if(i%2)
			for(int j=i;j>0;j--){
				a[i][j]=++r;if(r==p){
				ju=1;	break;
				} 	}
		else 
			for(int j=1;j<=i;j++){
				a[i][j]=++r;if(r==p){
					ju=1;break;
				} 	}
				//printf("r=%d\n",r);
		if(ju) break;
	}
	int x=1,y=1;
	while(a[x][x]){
		t=x;
		while(a[x][y]){
			printf("%d ",a[x++][y]);
		} 
		x=t;
		x++;y++;
		printf("\n");
	} 
	return 0;
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值