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

来源:互联网 发布:软件行业前景预测 编辑:程序博客网 时间:2024/05/16 11:54

题目大意: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

原创粉丝点击