小明正在电脑上玩一款打怪游戏,一共有n只怪物,编号从1到n,第i只怪物的血量为a[i]。小明的角色攻击力为k,对怪物进行攻击时,怪物的血量减少k,当怪物的血量小于等于零时,怪物死亡。但是他每次只能攻击血量最高的怪物,如果几只怪物血量相同,则攻击编号小的那个。你的目标是求出怪物死亡的顺序。
输入
第一行两个整数n和k。(1<=n<=100000,1<=k<=1e9)表示怪物的数量和角色攻击力。
第二行n个正整数a1,a2.....an。表示n个怪物的血量(1<=a[i]<=1e9)。
输出
一行,按怪物死亡顺序排列的编号。
分析
刚开始以为挺简单的,不就是一个结构体然后每次击杀怪物后进行排序吗,后来发现会超时。最后还是看了题解,才恍然大悟,原来完全可以跳过每次排序的步骤,只需要在开始打怪前将怪物的血量对k取模,因为能杀掉怪的情况一定是a[i]<=k所以a[i]>k的情况完全可以跳过这样只需要做一次排序,这里我用的是sort(O(nlogn);
#include<iostream>
#include<algorithm>
using namespace std;
typedef struct monster{
int blood;
int index;
}m;
m a[100010];
int n,k;
bool cmp(m x,m y)
{
return x.blood>y.blood||(x.blood==y.blood&&x.index<y.index);
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n>>k;
for(int i=1;i<=n;i++)
{
a[i].index=i;
cin>>a[i].blood;
}
for(int i=1;i<=n;i++)
{
if(a[i].blood%k==0) a[i].blood=k;
else a[i].blood%=k;
}
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++) cout<<a[i].index<<" ";
return 0;
}