列表

详情


NC53188. 画展

描述

译自 JOI 2019 Final T2「展覧会 / Exhibition
你将举办一个画展。在展览中,你需要将一些画放入一些画框中并摆放成一排。
展览有N幅候选画,编号从1到N。画具有大小S_i和美观度V_i
另外,有M个候选画框,编号从1到M。画框的大小为C_j
只有大小不超过C_j的画才能放入画框j中。每个画框中最多只能放一幅画。每幅要展出的画都必须放在一个画框中。
考虑到美观因素,展出的画必须满足以下条件:
  • 对于任意两幅相邻的画,右边的画框大小不小于左边的画框
  • 对于任意两幅相邻的画,右边的画的美观度不小于左边的画的美观度
你需要求出你最多能展出多少幅画。

输入描述

从标准输入中读取数据。
第一行两个整数N和M。
接下来N行,第i行为两个整数S_iV_i
接下来M行,第i行为一个整数C_i

输出描述

输出数据到标准输出中。
输出一行一个整数,表示你最多能展出的画的数量。

示例1

输入:

3 4
10 20
5 1
3 5
4
6
10
4

输出:

2

说明:

在这个样例中,一个合法的方案是:从左往右,第二幅画放在第二个框中,第一幅画放在第三个框中。

示例2

输入:

3 2
1 2
1 2
1 2
1
1

输出:

2

示例3

输入:

4 2
28 1
8 8
6 10
16 9
4
3

输出:

0

示例4

输入:

8 8
508917604 35617051
501958939 840246141
485338402 32896484
957730250 357542366
904165504 137209882
684085683 775621730
552953629 20004459
125090903 607302990
433255278
979756183
28423637
856448848
276518245
314201319
666094038
149542543

输出:

3

原站题解

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

C++11(clang++ 3.9) 解法, 执行用时: 109ms, 内存消耗: 4600K, 提交时间: 2020-04-12 15:43:09

#include <bits/stdc++.h>
using namespace std;
pair<int, int> a[1000000];
int b[1000000], n, m, ans,i,j;

int main() {
	cin >> n >> m;
	for (i = 1; i <= n; i++) 
	scanf("%d%d", &a[i].second, &a[i].first);
	for ( i = 1; i <= m; i++) 
	scanf("%d", &b[i]);
	sort(a + 1, a + n + 1); 
	sort(b + 1, b + m + 1);
	i=n;
	j=m;
while(i>0&&j>0)
{

		if (b[j] >= a[i].second) 
		{
	ans++, j--;}
	i--;
	}
	cout << ans << endl;
}

C++14(g++5.4) 解法, 执行用时: 189ms, 内存消耗: 2028K, 提交时间: 2020-04-12 18:09:53

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
const  long long int Ma=100005;
int N,M;
pair<int,int>a[Ma]; 
long long ci[Ma],ans=0,temp,temp1;
int main()
{
	cin>>N>>M;
	for(int i=1;i<=N;i++)
	cin>>a[i].second>>a[i].first;
	for(int i=1;i<=M;i++)
	cin>>ci[i];
	sort(a+1,a+N+1);
	sort(ci+1,ci+M+1); 
	
	for(int i=N,j=M;i&&j;i--)
	if(ci[j]>=a[i].second)ans++,j--;
	cout<<ans<<endl;
	return 0; 
}

上一题