这个题思路也比较简单,利用两次sort函数进行排序,定义两个不同的cmp函数;
但是在确定每个安全指数的预测正确次数(ceita[i].sum)时,使用两次for循环会直接超时,然后就把它改成代码中的一大段while代码,Debug了很长时间才通过:
主要是找到ceita[i].sum的规律,当ceita[i].y逐渐递减(无重复),如示例一,会有如下规律
1. ceita[1].sum可以直接遍历求出;
2. 若ceita[i].result == 1,则ceita[i].result = ceita[i-1].result + 1;
3. 若ceita[i].result == 0,则ceita[i].result = ceita[i-1].result - 1;
可恶的是,如果有重复的ceita[i].y,那么
- 接下来的几个安全指数的result都会影响当前的sum
while (ceita[i].y == ceita[j].y ) - 并且这些相同的安全指数共用同一个sum值;
while(i < j - 1)
写代码前先分好类就会好写很多。
#include<bits/stdc++.h>
using namespace std;
struct Ceita{
int y;
int result;
int sum;
};
bool cmp1(Ceita a,Ceita b){
return a.y > b.y;
}
bool cmp2(Ceita a,Ceita b){
if(a.sum == b.sum) return a.y >b.y ;
else return a.sum > b.sum;
}
int main(){
int m;
scanf("%d",&m);
Ceita ceita[m];
for(int i = 0; i < m; i++){
scanf("%d %d",&ceita[i].y,&ceita[i].result);
ceita[i].sum =0;
}
sort(ceita,ceita+m,cmp1);
for (int j = 0;j < m; j++){
if((ceita[j].y < ceita[0].y && ceita[j].result == 0 )||(ceita[j].y >= ceita[0].y && ceita[j].result == 1 )){
ceita[0].sum ++;
}
}
int i = 0;
int j = 1;
while(i < m && j < m){
j = i + 1 ;
while (ceita[i].y == ceita[j].y ){
if(j == i + 1){
if(ceita[i].result == 1){
ceita[i].sum = ceita[i-1].sum + 1;
}else{
ceita[i].sum = ceita[i-1].sum - 1;
}
}
if(ceita[j].result == 1){
ceita[i].sum ++;
}else{
ceita[i].sum --;
}
j++;
}
while(i < j - 1){
ceita[++i].sum = ceita[i-1].sum;
}
i++;
if(ceita[i].result == 1){
ceita[i].sum = ceita[i-1].sum + 1;
}else{
ceita[i].sum = ceita[i-1].sum - 1;
}
}
sort(ceita,ceita+m,cmp2);
printf("%d",ceita[0].y);
return 0;
}