Wannafly模拟赛4 A Laptop (前缀数组)

题目大意:emmmmm……中文题,不用解释了吧

解题思路:

         一开始是直接就想着排个序然后开始枚举,目前水平对时间复杂度还不太会算,但是听了别人的分析,会超时,枚举肯定不行,所以就要换个思维。

         题目要求被完虐的电脑数量,什么叫做被完虐呢,就是内存和速度都比别台电脑差,假如有一台电脑,存在任意一台电脑两项的值都比它大一些,那这台电脑就被完虐。因为每台电脑有2个数要比较,所以我们可以开结构体,先对其中的一个参数排好序,然后在后面比较时只要比较一个参数即可。怎么比较呢?枚举的思想是,假如我们从第i个开始比较,那么我们就要把前i-1个都比一遍,全部循环下来会超时,所以不行。根据前缀数组的思想,我们只要从第一个开始比较,第1个和第0个比(最大值就是它自己),然后第2个和前1个的最大值比,第3个和前两个的最大值比,以此类推,开一个新的数组来记录每次比较出的最大值,然后后面再用一个循环将这个新的数组和原来的排列进行比较,不符合的则记录。

代码代码:

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e5+5;

int n,ans;
int pre[maxn];
bool flag;

struct node
{
    int m,v;
    bool operator < (const node &a)const
    {
        return m>a.m;
    }
} mapn[maxn];


int main()
{
    while(cin>>n)
    {
        for(int i=0; i<n; i++)
        {
            cin>>mapn[i].m>>mapn[i].v;
        }
        sort(mapn,mapn+n);
        pre[0]=mapn[0].v;
        for(int i=1; i<n; i++)
        {
            pre[i]=max(mapn[i].v,pre[i-1]);
        }
        ans=0;
        for(int i=1; i<n; i++)
        {
            if(pre[i-1]>mapn[i].v) ans++;
        }
        cout<<ans<<endl;
    }
    return 0;
}





~step by step

发布了37 篇原创文章 · 获赞 23 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/zsheng_/article/details/78323100