必对题解·菠萝排名
2026-07-27 17:57:24
发布于:天津
16阅读
0回复
0点赞
防透视
代码如下:
#include<bits/stdc++.h>
using namespace std;
//定义一个结构体
struct f{
int a,b;
int j;
int flag;
};
//编写cmp函数
bool cmp(f x,f y){
//符合要求的排在前面,都不符合都排后面
if(x.flag!=y.flag||x.flag==0)return x.flag>y.flag;
//如果都符合要求则按甜度从大到小排序
if(x.a!=y.a)return x.a>y.a;
//如果甜度相同则按酸度从小到大排序
if(x.b!=y.b)return x.b<y.b;
//酸度也相同则按序号从小到大排序
return x.j<y.j;
}
int main(){
//输入n,x,y
int n,x,y;
cin>>n>>x>>y;
//输入n组数据
f a[n+1];
for(int i=1;i<=n;i++){
cin>>a[i].a>>a[i].b;
a[i].j=i;
if(a[i].a>=x&&a[i].b<=y)a[i].flag=1;
else a[i].flag=0;
}
//按照题目要求排序
sort(a+1,a+n+1,cmp);
//输出最后结果
for(int i=1;i<=n;i++){
//如果当前数据不符合要求则直接结束循环
if(!a[i].flag)break;
//否则输出当前数据的序号
cout<<a[i].j<<' ';
}
return 0;
}
节省空间的写法(别问为什么没有节省时间的方法):
#include<bits/stdc++.h>
using namespace std;
//定义一个结构体
struct f{
int a,b;
int j;
};
//编写cmp函数
bool cmp(f x,f y){
//按甜度从大到小排序
if(x.a!=y.a)return x.a>y.a;
//如果甜度相同则按酸度从小到大排序
if(x.b!=y.b)return x.b<y.b;
//酸度也相同则按序号从小到大排序
return x.j<y.j;
}
int main(){
//输入n,x,y
int n,x,y;
cin>>n>>x>>y;
//输入n组数据
f a[n+1];int a_n=0;
for(int i=1;i<=n;i++){
//用两个临时变量存储输入的数据
int p,q;
cin>>p>>q;
//符合要求则将其数据移入a数组
if(p>=x&&q<=y){
a[++a_n].a=p;
a[a_n].b=q;
a[a_n].j=i;
}
}
//按照题目要求排序
sort(a+1,a+a_n+1,cmp);
//输出最后结果
for(int i=1;i<=a_n;i++){
//输出当前数据的序号
cout<<a[i].j<<' ';
}
return 0;
}
最后想问一下有没有什么更快的方法呢?
发在评论区里吧
这里空空如也








有帮助,赞一个