优快云竞赛第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;
}