CSDN每日一练20230303(K皇把妹)

题目名称:城市交通规划(动态规划)

题目描述

有向图M中存在n个节点,编号为[1-n]. 两个节点的距离为abs(i-j)。 每个节点i存在一条特殊边到a[i]。 节点i通过特殊边到达a[i]距离为1. 列出节点1到其他节点的最短距离。 输入描述: 第一行输入整数n。(1<=n<=100000) 第二行输入整数a。(1<=a<=n)

输入描述:

第一行输入整数n。(1<=n<=100000) 第二行输入整数a。(1<=a<=n)

输出描述:

输出n个整数

示例

输入
3
2 2 3
输出
0 1 2

规则应该是
第i个节点应该是
1+第(i-1)个节点的值
1+第(i+1)个节点的值
1+第a[i]个节点的值
的最小值

可能要用n*n的表格吧
但是还是没搞定

题目名称:K皇把妹(数组遍历)

题目描述

存在n个节点,目标节点在m。 每个节点有自己的权值a。 在权值k内选择一个权值非0节点且与目标节点距离最近。 节点i与节点j的距离为abs(i-j)。

输入描述:

第一行输入整数n,m,k.(1<=n,m,k<=100) 第二行输入n个整数的权值。(1<=a<=1000)

输出描述:

输出最小距离

示例

输入
7 3 50
62 0 0 0 99 33 22
输出
3

一道很简单的遍历题,为什么会定为困难基本???

#include <stdio.h>
#include <stdlib.h>
int min(int a,int b) {
	return a<b?a:b;
}
void solution(int n, int m, int k, int arr []) {
	int s=101;
	for (int i=0;i<n;i++) {
		if(arr[i]==0||arr[i]>k) {
			continue;
		}
		s=min(s,abs(i+1-m));
	}
	printf("%d",s);
}
int main() {
	int tem_arr[3];
	for (int i = 0; i < 3; i++) {
		scanf("%d", &tem_arr[i]);
	}
	int n = tem_arr[0];
	int m = tem_arr[1];
	int k = tem_arr[2];
	int* arr;
	arr = (int*)malloc(n * sizeof(int));
	for (int i = 0; i < n; i++) {
		scanf("%d", &arr[i]);
	}
	solution(n, m, k, arr);
	return 0;
}

题目名称:字符串全排列(排列组合)

题目描述

对K个不同字符的全排列组成的数组, 面试官从中随机拿走了一个, 剩下的数组作为输入, 请帮忙找出这个被拿走的字符串? 比如[“ABC”, “ACB”, “BAC”, “CAB”, “CBA”] 返回 “BCA”

输入描述:

第一行输入整数n,表示给定n个字符串。(n == x!-1,2<=x<=10) 以下n行每行输入一个字符串。

输出描述:

输出全排列缺少的字符串。

示例

输入
5
ABC
ACB
BAC
CAB
CBA
输出
BCA

写过多次了,以第一组为输入,进行全排序比较即可
不存在则输出
要考虑n=0的情况

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void swap(char*str,int a,int b) {
	char c=str[a];
	str[a]=str[b];
	str[b]=c;
}
void checkstr(char*str,int n,char*arr[]) {
	int bFind=0;
	for (int i=0;i<n;i++) {
		if(strcmp(str,arr[i])==0) {
			bFind=1;
			break;
		}
	}
	if(bFind==0) {
		printf("%s",str);
	}
}
void sortstr(char*str,int len,int pos,int n,char*arr[]) {
	if(len==pos) {
		checkstr(str,n,arr);
		return;
	}
	for (int i=pos;i<len;i++) {
		swap(str,i,pos);
		sortstr(str,len,pos+1,n,arr);
		swap(str,i,pos);
	}
}
void solution(int n, char*arr[]) {
	int len=strlen(arr[0]);
	char*str=(char*)malloc(sizeof(char)*(n+1));
	strcpy(str,arr[0]);
	sortstr(str,len,0,n,arr);
}
int main() {
	int n;
	scanf("%d", &n);
	if(n==0) {
		return 0;
	}
	char** arr;
	arr = (char**)malloc(n * sizeof(char*));
	for (int i = 0; i < n; i++) {
		arr[i] = (char*)malloc(sizeof(char));
	}
	for (int i = 0; i < n; i++) {
		scanf("%s", arr[i]);
	}
	solution(n, arr);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值