CSDN第70期编程竞赛活动经验

1、题目名称:小张的手速大比拼

在很久很久以前,小张找到了一颗有 N 个节点的有根树 T 。树上的节点编号在 1 到 N 范围内。他很快发现树上的每个节点 i 都有一个对应的整数值 V[i] 。一个老爷爷对他说,给你一个整数 X ,如果你能回答我的 M 个问题,他就给张浩扬购买一些零食。对于每个问题 Q[i], 请你找到 在 T 中以节点 Q[i] 为根的子树中的所有节点 ( 包括 Q[i]) 中,有没有两个节点 A, B (A != B) 的值 V[A] ^V[B] 的异或和为 X 。 如果有这样的两个节点, 请你输出 YES 。 否则你需要输出 NO 表示没有节点符合上面的条件。

花了很长时间,最后通过还是0,我看大家都这样,应该就是测试有问题,就先忽略

2、题目名称:坐公交

公交上有N 排凳子,每排有两个凳子,每一排的凳子宽度不一样。有一些内向和外向的人按照顺序上车。 外向的人(0 ):只会选择没人的一排坐下,如果有很多排符合要求,他会选择座位宽度最小的坐下。 内向的人( 1 ):只会选择有 人的一排坐下,如果有很多排符合要求,他会选择座位宽度最大的坐下。 数据保证存在合理。输出每个人所在的排。

题目本身不难,关键是要如果提高查询效率
先根据凳子宽度排序,找起来就快了,
外向的人从最小开始找位置,并记录当前位置(肯定递增的),可以加速查询
内向人从外向的最高位开始找位置就行。
每排肯定是一个外向一个内向的

首先用了qsort进行排序,
然后用变量记录了外向人的位置

#include <stdio.h> 
#include <stdlib.h> 
typedef struct _POS {
	int id;
	int width;
	int num;
}
POS;
int cmppos(const void*a,const void*b) {
	POS*pa=(POS*)a;
	POS*pb=(POS*)b;
	return pa->width>pb->width;
}
int nopeoplestart=0;

void find0(int n, POS *arr) {
	for (int i=nopeoplestart;i<n;i++) {
		if(arr[i].num>0) {
			continue;
		}
		arr[i].num++;
		nopeoplestart=i+1;
		printf("%d",arr[i].id);
		break;
	}
}
void find1(int n, POS *arr) {
	for (int i=nopeoplestart-1;i>=0;i--) {
		if(arr[i].num==0||arr[i].num==2) {
			continue;
		}
		arr[i].num++;
		printf("%d",arr[i].id);
		break;
	}
}
void solution(int n, POS *arr, char *personality) {
	int len=n*2;
	for (int i=0;i<len;i++) {
		char ch=personality[i];
		if(ch=='0') {
			find0(n,arr);
		} else {
			find1(n,arr);
		}
		if(i!=len-1) {
			printf(" ");
		}
	}
}
int main() {
	int n;
	scanf("%d", &n);
	POS* arr;
	arr = (POS*)malloc(n * sizeof(POS));
	for (int i = 0; i < n; i++) {
		arr[i].id=i+1;
		arr[i].num=0;
		scanf("%d", &arr[i].width);
	}
	qsort(arr,n,sizeof(POS),cmppos);
	
	char personality[200000]= {0};
	scanf("%s", personality);
	solution(n, arr, personality);
	return 0;
}

3、题目名称:三而竭

一鼓作气再而衰三而竭。 小艺总是喜欢把任务分开做。 小艺接到一个任务,任务的总任务量是n 。 第一天小艺能完成 x 份任务。 第二天能完成x/k… 第 t 天能完成 x/(k^(t-1)) 。 小艺想知道自己第一天至少完成多少才能完成最后的任务。

老题目了,x的取值范围为1~n;
判断X是否满足条件就行,用二分法求解就行

int check(int n,int k,int x) {
	int s=0;
	do {
		s+=x;
		x/=k;
	}while(x>0);
	if(s>=n) {
		return 1;
	}
	return 0;
}

4、题目名称:争风吃醋的豚鼠

N个节点两两建边。 不存在 3 个节点相互之前全部相连。 (3 个节点连接成环 ) 最多能建立多少条边?

老题目了,就是将N分成2组,就是当2组相等时,最大
S=N/2*(N-N/2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值