最开始想用深搜,把所有的方案都试一遍,最后再排个序。 这个方法递归的层数太多,导致段错误,只过了样例。事实证明,递归慎用,容易堆栈溢出。代码如下: #include<iostream> 这个方法还存在题意理解错误的问题,直接跳过了(nk , nk+k)的糖。 |
后来,网上搜了下题解,看了别人的代码,明明白白的 。一颗糖最后总要被吃的,早上或者晚上。为了使甜蜜值最大,只需要比较这颗糖在早上吃甜蜜值高还是晚上甜蜜值高。因此要用结构体进行排序。在题目要求下,早上只能吃k颗糖,将排序后的结构体里早上的前k项和晚上的后n-k项累加得出结果。代码如下:
#include<iostream>
#include<algorithm>
using namespace std ;
const int N = 1e5 ;
int n , k , ans = 0 ;
struct node{
int x , y ;
};
node a[N+5] ;
bool cmp(node a , node b){
return a.x-a.y > b.x-b.y ;
}
int main (){
cin >> n >> k ;
for(int i = 0 ; i < n ; i++){
scanf("%d" , &a[i].x) ;
}
for(int i = 0 ; i < n ; i++){
scanf("%d" , &a[i].y) ;
}
sort(a , a+n , cmp) ;
for(int j = 0 ; j < k ; j++){
ans += a[j].x ;
}
for(int j = k ; j < n ; j++){
ans += a[j].y ;
}
cout << ans << endl ;
return 0 ;
}
最后,感谢一下Ok-ok博主的代码,原文在这:
牛客每日练习----比赛,完全平方数,装进肚子
https://blog.csdn.net/weixin_44170305/article/details/105729542