作者:乐天JOE
题目链接
题目大意
给定 n n n 个数列的第 1 1 1 项,数列长度为 m + 1 m+1 m+1。
第 i i i 个数列的第 j j j 项需要满足 a i , j = a i , j − 1 × i a_{i,j}=a_{i,j-1} \times i ai,j=ai,j−1×i
把数列按照字典序排序,输出排序后的序列编号。
思路
前置芝士:字典序排序
这题的你需要知道数列的字典序排序。
排序首先看第一位,如果相同,看第二位,再相同,看第三位,以此类推即可。
从小到大。
分析
我们首先来看这个数列,字典序会先排数列中的第一个数字,如果不一样,只需要把小的放前即可。
那么对于第一个数字一样的情况,我们先来看一下数列需要满足的递推式 a i , j = a i , j − 1 × i a_{i,j}=a_{i,j-1} \times i ai,j=ai,j−1×i ,我们发现从第二位开始,由于两个数列的 i i i 不同,所以第二个数肯定不同,那么谁大谁小呢?
当然是 i i i 比较小的哪一方比较小的啊!!!
那就很简单了,我们只需要再对于编号再排序即可。
然后你就会发现你是 70 70 70 分,为什么呢?我们看向数据范围,后面三个点的数据有一处为 1 ≤ ∣ a i , 0 ∣ ≤ 1 0 9 1 \leq \left| a_{i,0} \right| \leq 10^9 1≤∣ai,0∣≤109。
说明什么。有可能会有负数,那么如果是负数,如果一样的数,反而要输出 i i i 比较大的哪一方。
实现
实现就十分简单了,只需要用结构体,里面定义编号和序列的第一位数字。
然后再用 cmp 把需要判断的东西写在里面就行了。
对了,保险一点,记得开 long long
。
CODE
Talk is cheap.Show me the code —— AprendiZ
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node
{
int num,id;
}a[100005];
int n,m;
bool cmp(node x,node y)
{
if(x.num!=y.num)
return x.num<y.num;
if(x.num<0)
return x.id>y.id;
return x.id<y.id;
}
main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
cin>>a[i].num,a[i].id=i;
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
printf("%d ",a[i].id);
return 0;
}
本人是个蒟蒻,学艺不精,如有错误或建议,请在评论区指出。
感谢观看,既然你都看到这里了,不妨点个赞或者关注?