Loading

B. Greenhouse Effect

Link

考虑最多几个不用移动 很容易想到最长非严格递增子序列不动 答案就是n-LIS

code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pb push_back

const int N = 5005;
struct node
{
	int first;
	double second;
}b[N];
bool cmp(node a,node b)
{
	return a.second<b.second;
}
int bin(int a[],int len,int num)
{
	int left=1,right=len;
	while(left<=right)
	{
		int mid=(left+right)/2;
		if(num<a[mid])  //若最长不下降子序列,改<= 为 <
			right=mid-1;
		else
			left=mid+1;
	}
	return left;
}
 
int LIS(int a[],int len) //最长上升子序列 
{
	int i,j,cnt=1;
	int *dp=new int[len+1];
	dp[1]=a[1];
	for(i=2;i<=len;i++)
	{
		if(a[i]>=dp[cnt])	//若最长不下降子序列,改> 为 >=
			dp[++cnt]=a[i];
		else if(a[i]<dp[1])    //若最长不下降子序列,改<= 为 <
			dp[1]=a[i];
		else
			dp[bin(dp,cnt,a[i])]=a[i];			
	}
	return cnt;
}
int n,m;
int a[N];
int main()
{
	ios::sync_with_stdio(false);

	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>b[i].first>>b[i].second;
	}
	sort(b+1,b+1+n,cmp);
	for(int i=1;i<=n;i++) a[i] = b[i].first;
	cout<<n-LIS(a,n);
}
posted @ 2021-03-13 21:35  金木换  阅读(27)  评论(0)    收藏  举报