AtCoderBeginnerContest378比赛第三题C−Repeating
为什么第一个样例就成功排序出来了,而第二个没有进行排序?(代码、思路、原题目都在下面)
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
struct ab{
long long num=0;
long long s=0;
long long before=0;
};
int n;
bool cmp(ab a,ab b){
if(a.num == b.num){
return a.s<b.s;
}else{
return a.num<b.num;
}
}
bool cmp2(ab a,ab b){
return a.s<b.s;
}
int main(){
cin>>n;
ab a[n+1];
for(int i=1;i<=n;i++){
cin>>a[i].num;
a[i].s=i;
}
sort(a,a+n,cmp);
//检查排序后的结构体数组
for(int i=1;i<=n;i++){
cout<<a[i].num<<"("<<a[i].s<<")"<<" ";
}
cout<<endl;
a[1].before=-1;
for(int i=2;i<=n;i++){
if(a[i].num==a[i-1].num){
a[i].before=a[i-1].s;
}else{
a[i].before=-1;
}
}
sort (a,a+n,cmp2);
for(int i=1;i<=n;i++){
cout<<a[i].before<<" ";
}
return 0;
}
简单说一下我的思路:
1.首先把每个数据以结构体的方式存储;
2.把对应的结构体数组以num从小到大且当num大小相同时以对应s的从小到大排序(before指每个数对应的答案,num指对应的值Ai,s指num排序前的原下标);
3.判断新排序后每一个值的num是否与前一个num相同,如果是则记录before前一个的s否则记录before为-1;
4.按照s大小重新排序为原来输入时的顺序在依次输出before值。
(第一组样例成功了,但第二组样例无论如何都没有进行第一次排序,如果不对结构体在定义时就赋值为0,那么第一个输入的num就会丢数据)
这是为什么,思考半天都没想通,求大佬指导!
原题:
问题陈述
给你一个由 N 个正数组成的序列 A =(A1,A2,….,An)。求长度为 N 的序列 B=(B1,B,….,Bn)的定义如下。
·对于i=1,2,...,N ,定义 Bi 如下:
·设 Bi是在i之前出现元素 Ai 的最近位置。如果不存在这样的位置,则设为 Bi= -1更确切地说,如果存在一个正整数 j,使得 Ai= Aj,和j<i,那么就让 Bi成为最大的j。如果不存在这样的j,则设 Bi= -1.
原题网址AtCoderBeginnerContest378比赛第三题