这个程序为什么第一个样例排序了但第二个样例就没有排序?
  • 板块学术版
  • 楼主X666999Y
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/11/2 23:34
  • 上次更新2024/11/3 11:23:49
查看原帖
这个程序为什么第一个样例排序了但第二个样例就没有排序?
1022961
X666999Y楼主2024/11/2 23:34

AtCoderBeginnerContest378AtCoder Beginner Contest 378比赛第三题CRepeatingC - 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,snum排序前的原下标);
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比赛第三题AtCoder Beginner Contest 378比赛第三题

2024/11/2 23:34
加载中...