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)