优快云竞赛第11期解题

优快云竞赛第11期解题

这次竞赛的奖励还蛮大的,我这种业余选手也得了个背包,超级开心😊。希望优快云竞赛越办越好!回想自己都毕业好几年了,当时做题还是因为课程需要刷题混分的,也没参加过啥竞赛,工作后都是靠兴趣支撑下去的,偶尔也会登上Openjudge刷刷题,还专门买了本书看来着,纯粹当作一种思维能力的提升吧。
这是我第5次参加优快云的竞赛了,提个建议:那就是模板的优化,其他倒是没发现什么BUG,我比较懒有模板就直接用模板了,个人觉得这个模板还是有很多要吐槽的。一个是类型的定义,既然你给了我模板,那类型就定义得准确一点,比如需要用到双精度double的时候,模板就不要定义成float,需要用到64位整型的时候就不要定义成32位整形;还有一个是在函数里malloc分配空间的时候,用完了给个free,虽然这个没有必要,但强迫症患者会感到舒适。

第1题:圆小艺

最近小艺酱渐渐变成了一个圆滑的形状-球!! 小艺酱开始变得喜欢上球! 小艺酱得到n个同心圆。 小艺酱对着n个同心圆进行染色。 相邻的圆范围内不能有相同的颜色。相隔一层的圆颜色相同。 小艺酱想知道圆最外层的那种颜色全部染了多少?

  • 这里面就有一个我刚才说的问题,这里需要高精度的double,用float不会全过,后面我干脆直接来个宏定义#define float double省得一个个改。
#define pi 3.14159265359
#define float double
float S(float r){
	return pi*r*r;
}
int cmp(const void *a, const void *b){
	return *(int*)a - *(int*)b;
}
float solution(int m, int arr1[]){
	float result = 0;
	qsort(arr1, m, sizeof(int), cmp);
	for(int i = m - 1; i >= 0; i -= 2){
		if(i == 0){
			result += S(arr1[i]);
			break;
		}
		result += S(arr1[i]) - S(arr1[i - 1]);
	}

	return result;
}

第2题:K皇把妹

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

  • 这内容不知道和K皇把妹什么关系==,希望出题人细心一点吧。
int solution(int n, int m, int k, int arr[]){
	int result, a, b;
	m--;
	for(int i = 0; i < n; i++){
		a = m - i;
		b = m + i;
		if(a >= 0 && arr[a] <= k && arr[a] != 0){
			result = i;
			break;
		}
		if(b < n && arr[b] <= k && arr[b] != 0){
			result = i;
			break;
		}
	}
	return result;
}

第3题:筛选宝物

已知存在n个宝物,每个宝物都有自己的质量m和价值v,在考虑选择宝物时只能选择总质量小于等于M的方案,请问在最优方案下选择宝物,能获取到最大价值V是多少?

  • 这是经典的01背包问题,经典地不能再经典了==
int max(int a, int b){
	return a > b ? a : b;
}
int solution(int n, int m, int (*arr)[2]){
	int **T = NULL;
	T = (int**)malloc((n + 1) * sizeof(int*));
	for(int i = 0 ; i <= n; i ++){
		T[i] = (int*)malloc((m + 1) * sizeof(int));
		memset(T[i], 0, (m + 1) * sizeof(int));
	}
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= m; j++) {
			if(arr[i - 1][0] <= j){
				T[i][j] = max(arr[i - 1][1] + T[i-1][j-arr[i - 1][0]], T[i-1][j]);
			}
			else{
				T[i][j] = T[i - 1][j];
			}
		}
	}
	return T[n][m];
}

第4题:圆桌

有N个客人与足够多张的圆桌。主人安排每位客人坐在一个圆桌边,但是每位客人希望自己左右边上分别有一些空座位,不然会觉得害羞。注意,如果一个客人所在的圆桌只有他一个人,那么他左边的空座位数量就是他右边的空座位数量。 试问主人需要准备多少个座位,才能让每个客人舒适的坐下。

  • 时间主要花在这里了,扣分也扣在这里,当时没啥思路,后来干脆先按每人一桌来算,也得了一半的分数。后来看了几个大佬的解题,才发现原来我和正确答案只差两个排序,我只要把他们各自排下序就是正确答案了/(ㄒoㄒ)/~~下面给出的是我的错误解法哦。哦对了,好像还要64位整形,这也是模板需要改进的地方,另外模板的solution函数的第二个参数也给错了好像,如果没记错的话给的是arr[][],也有可能是第3题,记不大清了,所以关于此次竞赛我的最大建议就是优化模板。
int max(int a, int b) {
	return a > b ? a : b;
}
int solution(int m, int arr[][2]){
	int result = 0;
	for( int i = 0 ; i < m; i ++){
		result += max(arr[i][1], arr[i][1]) + 1;
	}
	return result;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xiao Ice

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值