当前位置: 首页> 教育> 培训 > 编程题:AOE还是单体?C++题解

编程题:AOE还是单体?C++题解

时间:2025/9/14 16:07:11来源:https://blog.csdn.net/kitesxian/article/details/141714369 浏览次数:0次

原题链接:链接;

简单思路:有三个怪物,一次蛮牛冲撞需要2点蓝量,那么冲撞一次仅需要2点蓝量,却消耗了三滴血,很划算,所以在怪物数量大于x(也就是蛮牛冲撞所需蓝量)的时候,就可以采纳蛮牛冲撞了,反之采用单体攻击。注:怪物数量==x时,既可以使用AOE也可以使用单体,我归纳到了单体中。

此题关键在于sort以及n<x时候,索引应该如何处理(映射即可int index = max(0,n-x);)


我的第一次错误代码:
 

// #include<iostream>
// #include<algorithm>
// using namespace std;
// int n,x;
// const int N = 2e5+10;
// int arr[N];
// int main(){
//     cin>>n>>x;
//     for(int i  = 0;i<n;i++)cin>>arr[i];
//     sort(arr,arr+n);
//     int index = max(0,n-x-1);//     long long ret = arr[index]*x;
//     for(int i = index+1;i<n;i++){
//         ret+=arr[i]-arr[index];
//     }
//     cout<<ret<<endl;
// }

正确代码:
 

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 2e5+10;
int arr[N];
int n,x;
int main(){cin>>n>>x;for(int i = 1;i<=n;i++){cin>>arr[i];}sort(arr+1,arr+1+n);long long ret = 0;int index = max(0,n-x);ret+=arr[index]*x;for(int i = index+1;i<=n;i++){arr[i]-=arr[index];ret+=arr[i];//18和19行也可以连写成:ret+=arr[i]-arr[index];}cout<<ret<<endl;
}

通过比较可以发现,在给arr数组放值的时候,我是从0开始放的,正确代码是从1开始的。

什么原因导致了测试用例不完全通过?
 

这道题最关键的步骤是int index = max(0,n-x);这个映射,也就是说如果x很大,即蛮牛冲撞所需要的蓝量很大的时候,比如冲撞1次就需要1000蓝量,但是总共只有999个人,我只需要蛮牛践踏999次数即可消耗同样的血量,为什么要花费1000蓝量呢?在总之,这道题在x很大的时候,索引可能会有负数,这是不被允许的,所以我们做了这个映射,映射到了0上,我们使用的全局的数组初始化方式,arr[0]=0,所以在下述循环中arr[i]-=arr[index]时候,相当于没有减,整个for循环就是对于所有血量的求和,然后使用蛮牛践踏一个一个消耗即可。你如果从0开始放数据,那代码就出了bug,每次都把arr[0]减掉了,所以只能通过部分测试用例。

关键字:编程题:AOE还是单体?C++题解

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: