列表

详情


NC19982. [HAOI2011]PROBLEM A

描述

一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低。”问最少有几个人没有说真话(可能有相同的分数)  

输入描述

第一行一个整数n,接下来n行每行两个整数,第i+1行的两个整数分别代表ai、bi

输出描述

一个整数,表示最少有几个人说谎

示例1

输入:

3
2 0
0 2
2 2

输出:

1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 129ms, 内存消耗: 12812K, 提交时间: 2022-10-31 21:17:45

 #include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int f[N];
int n;
map<int,int>sum[N];
vector<int>temp[N];

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int a,b;
       cin>>a>>b;
        int l=a+1,r=n-b;
        if(l>r) continue;
        if(!sum[l][r])
        temp[r].push_back(l);
        sum[l][r]=min(r-l+1,sum[l][r]+1);
    }
    
    for(int i=1;i<=n;i++)
    {
        f[i]=f[i-1];
        for(int j=0;j<temp[i].size();j++)
        {
            f[i]=max(f[temp[i][j]-1]+sum[temp[i][j]][i],f[i]);
        }
    }
    cout<<n-f[n]<<endl;
    
    return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 250ms, 内存消耗: 18368K, 提交时间: 2022-10-11 22:50:51

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
typedef pair<int,int> PII;
map<PII,int> mp1;
map<int,set<int>> mp2;
int f[N];
signed main()
{
    int n;    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int a,b;    cin>>a>>b;
        int l = a+1, r = n-b;
        mp2[r].insert(l);
        mp1[{l,r}]++;
    }
    
    for(int i=1;i<=n;i++)
    {
        f[i] = f[i-1];
       for(auto l : mp2[i])
       {
           f[i] = max(f[i],f[l-1] + min(mp1[{l,i}],i-l+1));
       }
    }
    cout<<n-f[n]<<endl;
}

上一题