列表

详情


NC235611. 牛牛国的战争

描述

牛牛国被卷入了一场战争之中!一共有 m 支部队入侵牛牛国,牛牛国拥有 n 支部队。每支部队拥有攻击力和防御力两项属性值。

由于战斗的消耗是巨大的,无论是入侵的部队还是牛牛国的部队都只能与最多一支对方的部队发生战斗,当两支部队发生战斗时,他们会同时进攻,如果一方的攻击力大于等于另一方的防御力,他就会摧毁对方。战斗的结果可能是一支队伍存活,两支队伍都存活或者都被对方摧毁。

牛牛国王爱民如子,他希望能够摧毁所有敌军,同时又希望自己的部队存活数量尽可能多,请你帮助牛牛国王判断能否摧毁所有敌军,如果可以,牛牛国最多存活多少支部队。

输入描述

第一行一个整数 ,代表数据组数.
对于每组数据,第一行包含两个整数 ,分别代表牛牛国部队数和入侵部队数。
之后 n 行,每行包含两个整数 ,代表牛牛国部队的攻击力和防御力。
之后 m 行,每行包含两个整数 ,代表入侵部队的攻击力和防御力。
数据保证 n,m 的总和不超过

输出描述

对于每组数据,输出一行"Case #x: y"(不含引号),其中 x 为测试数据编号(从1开始),如果不能摧毁所有敌军,y 是-1,否则 y 是最多存活部队数。

示例1

输入:

2
3 2
5 7
7 3
1 2
4 4
2 2
2 1
3 4
1 10
5 6

输出:

Case #1: 3
Case #2: -1

说明:

对于第一组数据,牛牛国王可以派出 <7,3> 对阵 <2,2>,派出 <5,7> 对阵 <4,4>,剩余部队不参与战斗,最后都存活,答案为 3

原站题解

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

C++(g++ 7.5.0) 解法, 执行用时: 168ms, 内存消耗: 6628K, 提交时间: 2022-08-15 22:11:10

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
struct Node
{
    int x,y;
}a[N],b[N];
bool cmp1(Node a,Node b)
{
    if(a.x==b.x)
        return a.y<b.y;
    return a.x>b.x;
}
bool cmp2(Node a,Node b)
{
    if(a.y==b.y)
        return a.x<b.x;
    return a.y>b.y;
}
int n,m;
int cnt=1;
void solve()
{
    multiset<int> q;
    cin>>n>>m;
    int ans=n;
    for(int i=1;i<=n;i++)
        cin>>a[i].x>>a[i].y;
    for(int i=1;i<=m;i++)
        cin>>b[i].x>>b[i].y;
    sort(a+1,a+1+n,cmp1);
    sort(b+1,b+1+m,cmp2);
    for(int i=1,j=1;i<=m;i++)
    {
        while(j<=n&&a[j].x>=b[i].y)
        {
            q.insert(a[j].y);
            j++;
        }
        auto it=q.upper_bound(b[i].x);
        if(it!=q.end())
        {
            q.erase(it);
        }
        else
        {
            if(q.empty())
            {
                printf("Case #%d: -1\n",cnt);
                cnt++;
                return ;
            }
            else
                ans--,q.erase(q.begin());
        }
    }
    printf("Case #%d: %d\n",cnt,ans);
    cnt++;
    return;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
        solve();
    return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 122ms, 内存消耗: 6700K, 提交时间: 2023-07-12 00:18:35

#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define ll long long
#define pii pair<int,int>
#define inf 0x3f3f3f3f
#define fi first
#define se second
#define iofast ios::sync_with_stdio(false);cin.tie(0), cout.tie(0)
using namespace std;
const int maxn = 1e5 + 5;
pii a[maxn], b[maxn];
void solve()
{
	int n, m;
	cin >> n >> m;
	rep(i, 1, n)cin >> a[i].first >> a[i].second;
	rep(i, 1, m)cin >> b[i].second >> b[i].first;
	sort(a + 1, a + n + 1, greater<pii>());
	sort(b + 1, b + m + 1, greater<pii>());
	int j = 1;
	int ans = 0;
	multiset<int> st;
	rep(i, 1, m)
	{
		while (j <= n && a[j].first >= b[i].fi)
			st.insert(a[j++].se);
		if (st.size()>0)
		{
			auto t = st.upper_bound(b[i].se);
			if (t!=st.end()) {
				st.erase(t);
			}
			else {
				st.erase(st.begin());
				ans++;
			}
		}
		else
		{
			cout << -1 << "\n";
			return;
		}

	}
	cout << n-ans << "\n";
}
int main()
{
	iofast;
	int t;
	cin >> t;

	rep(i,1,t) {
		cout << "Case #" << i << ": ";
		solve();
	}
}

上一题