CSDN每日一练20230306

题目名称:蚂蚁家族(分组)

题目描述

小蚂蚁群是一个庞大的群体,在这个蚂蚁群中有n只小蚂蚁 ,为了保证所有蚂蚁在消息传送的时候都能接收到消息,需要在他们之间建立通信关系。就是要求小蚂蚁都可以通过多只或者直接联系到其他人。 已知几条小蚂蚁之间有通信关系,请问还需要再新建至少多少条关系?

输入描述:

第一行输入整数n,m;n为小蚂蚁总数;m为关系数。(1<=n,m<=1000) 以下m行每行m对整数x,y。(代表x与y有联系)

输出描述:

输出最少需要新建关系数。

示例

输入
4 3
1 2
2 3
3 4
输出
0

昨天的题目
代码重新写了下

#include <stdio.h>
#include <stdlib.h>
int flag[1024]= {
	0
}
;
int findroot(int x) {
	if(flag[x]==x) {
		return x;
	}
	return findroot(flag[x]);
}
void update(int a,int b) {
	int ra=findroot(a);
	int rb=findroot(b);
	if(ra==rb) {
		return ;
	}
	flag[ra]=rb;
}
void solution(int n, int m, int (*arr)[2]) {
	for (int i=0;i<=n;i++) {
		flag[i]=i;
	}
	for (int i=0;i<m;i++) {
		update(arr[i][0],arr[i][1]);
	}
	int count=0;
	for (int i=1;i<=n;i++) {
		if(flag[i]==i) {
			count++;
		}
	}
	printf("%d",count-1);
}
int main() {
	int temp_arr[2];
	for (int i = 0; i < 2; i++) {
		scanf("%d", &temp_arr[i]);
	}
	int n = temp_arr[0];
	int m = temp_arr[1];
	int (*arr)[2];
	arr = (int(*)[2])malloc(m * sizeof(int*));
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < 2; j++) {
			scanf("%d", &arr[i][j]);
		}
	}
	solution(n, m, arr);
	return 0;
}

题目名称:非降序数组(数组)

题目描述

写一个函数,传入两个非降序的整数数组(A, B),将 A, B 合并成一个非降序数组 C,返回 C(不要使用内置 sort 函数)。(测试用例仅做参考,我们会根据代码质量进行评分)

输入描述:

第一行输入两个整数n,m。(1<=n,m<=100000)分别表示数组A,B的大小。 第二行给出n个整数a。(1<=a<=10000) 第三行给出m个整数b。(1<=b<=10000)

输出描述:

输出合并之后排序好的数组。

示例

输入
3 3
1 9 10
3 12 41
输出
1 3 9 10 12 41

入门的题目

#include <stdio.h>
#include <stdlib.h>
void solution(int n, int m, int num1[], int num2[]) {
	int *ret=(int*)malloc(sizeof(int)*(n+m));
	int p=0;
	int a1=0;
	int a2=0;
	while(a1<n&&a2<m) {
		if(num1[a1]<num2[a2]) {
			ret[p++]=num1[a1++];
		} else {
			ret[p++]=num2[a2++];
		}
	}
	while(a1<n) {
		ret[p++]=num1[a1++];
	}
	while(a2<m) {
		ret[p++]=num2[a2++];
	}
	for (int i=0;i<m+n;i++) {
		printf("%d ",ret[i]);
	}
}
int main() {
	int n;
	int m;
	scanf("%d", &n);
	scanf("%d", &m);
	int* num1;
	num1 = (int*)malloc(n * sizeof(int));
	int* num2;
	num2 = (int*)malloc(m * sizeof(int));
	for (int i = 0; i < n; i++) {
		scanf("%d", &num1[i]);
	}
	for (int i = 0; i < m; i++) {
		scanf("%d", &num2[i]);
	}
	solution(n, m, num1, num2);
	return 0;
}

题目名称:新型美丽数列

题目描述

定义美丽数列A: 1. 数列中相邻的数越是靠内相对大小加一,a[2]=a[1]+1,a[n-2]=a[n-1]+1… 2. 距离边缘距离相等的数的大小相等:a[0] = a[n-1],a[1] = a[n-2]… 通过修改最小的数字使得给定数列变成美丽数列。 修改后的值必须仍是正整数。

输入描述:

第一行输入整数n。(1<=n<=1000)表示数列的大小。 第二行输入n个整数。

输出描述:

输出最小修改。

示例

输入
3
1 1 1
输出
1

曾经比赛中出现的题目,应该是输出最小修改的个数
暴力方法,假设第一个位置上的数不变,遍历得到需要修改的个数,
依次第二个,第三个。
如果某次遍历时有其他位置上的值也没改变,可以提前赋值
这里通过率只有20%,看了其他人的答案,也就这样。

#include <stdio.h>
#include <stdlib.h>
int flag[1024]= {
	0
}
;
int min(int a,int b) {
	return a<b?a:b;
}
int max(int a,int b) {
	return a>b?a:b;
}
//假设pos位置上的数不改变
int check(int n,int arr[],int pos) {
	if(flag[pos]>0) {
		return flag[pos];
	}
	//距离左侧数字
	int l=arr[pos]-pos;
	//距离右侧数字
	int r=arr[pos]-(n-pos-1);
	printf("pos:%d %d l:%d r:%d\n",pos,arr[pos],l,r);
	int s=max(l,r);
	if(s<1) {
		flag[pos]=-1;
		return -1;
	}
	int tmp[1024]= {
		0
	}
	;
	int count=0;
	l=0;
	r=n-1;
	while(l<=r) {
		if(l==r) {
			if(arr[l]!=s) {
				count++;
			} else {
				tmp[l]=1;
			}
		} else {
			if(arr[l]!=s) {
				count++;
			} else {
				tmp[l]=1;
			}
			if(arr[r]!=s) {
				count++;
			} else {
				tmp[r]=1;
			}
		}
		s++;
		l++;
		r--;
	}
	flag[pos]=count;
	for (int i=0;i<n;i++) {
		if(tmp[i]==1) {
			flag[i]=count;
		}
	}
	return count;
}
void solution(int n,int arr []) {
	int s=n;
	for (int i=0;i<n;i++) {
		int t=check(n,arr,i);
		if(t!=-1) {
			s=min(s,t);
		}
	}
	printf("%d",s);
}
void solutionv2(int n,int a []) {
	int min = n;
	int b[1024]= {
		0
	}
	;
	for (int i=0; i<n; i++) {
		b[i] = a[i];
		int j;
		if(n % 2 == 1) {
			b[n / 2] = b[i] + n/2 - i;
			// printf("****%d", b[n/2]);
			j = 0;
			while(j + n/2 <n) {
				b[n/2 + j] = b[n/2] - j;
				b[n/2 - j] = b[n/2] - j;
				j++;
			}
		} else {
			if(i< n/2) {
				b[0] = b[i] - i;
				j = 0;
				while(j<n/2) {
					b[j] = b[0] + j;
					b[n-j-1] = b[j];
					j++;
				}
			} else {
				b[n-1] = b[i] - (n-1) +i;
				j = 0;
				while(j<n/2) {
					b[j] = b[n-1] + j;
					b[n-1-j] = b[j];
					j++;
				}
			}
		}
		int ii, num = 0;
		for (ii=0; ii<n; ii++) {
			// printf("%d ", b[ii]);
			if(b[ii] <=0) {
				num = n;
			}
			if(a[ii] != b[ii]) {
				num ++;
			}
		}
		if(min > num) {
			min = num;
		}
	}
	printf("%d\n", min);
}
int main() {
	int n;
	scanf("%d", &n);
	int* arr;
	arr = (int*)malloc(n * sizeof(int));
	for (int i = 0; i < n; i++) {
		scanf("%d", &arr[i]);
	}
	solutionv2(n, arr);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值