列表

详情


NC232438. [NCT058C1]简单题

描述

C 现在正在玩一款战争策略游戏,在这个游戏中,玩家一开始拥有 n 个堡垒,游戏目标是占领另外 n 个堡垒。

因为任意一个堡垒都仅有两种状态,正在修建或慢慢损耗,所以每个堡垒都有一个与时间相关的战斗力 w,满足关系式 ,其中 k 为战斗力变化率,t 为当前时间,b 为初始战斗力。

在这个游戏中,堡垒 i 能打败堡垒 j 当且仅当 ,并且当堡垒 i 打败堡垒 j 以后,i 中的驻军可以转移到 j,同时玩家失去对 i 的所有权并获得 j 的所有权。

时,玩家拥有 n 个堡垒。给定所有的 2n 个堡垒的初始战斗力和战斗力变化率,玩家可以在任意整数时刻进行任意次操作。请你求出小 Cn 个目标堡垒全部占领的最短用时。

如果无论如何都没法占领 n 个目标堡垒,则输出 "Can't win!"(不含引号).

PS : 同一时间同一个城堡内可以有多只驻军。本题与 C2 仅有城堡内驻军数量限制的区别。

输入描述

第一行一个正整数 n.

接下来 n 行,每行两个整数 k_i,b_i,表示你现在拥有的堡垒的参数。

接下来 n 行,每行两个整数 ,表示目标堡垒的参数。

输出描述

一个非负整数表示答案,或一个字符串 "Can't win!".

示例1

输入:

10
3 -208
-3 845
3 -808
-8 466
2 -727
10 308
0 260
8 368
1 -887
0 426
2 298
-1 11
0 132
2 -412
-1 578
4 -613
9 -119
-2 716
2 -266
-6 307

输出:

305

原站题解

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

C++ 解法, 执行用时: 602ms, 内存消耗: 8760K, 提交时间: 2022-07-14 17:24:29

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N=1000010;

struct Node {
	ll k,b,op;
}p[N];

bool cmp(Node a,Node b){
	return a.b<b.b;
}
int n;
bool check(ll mid){
	vector<ll>v1;
	vector<ll>v2;
	ll mx=-1e18;
	for(int i=1;i<=n*2;i++){
		ll now=p[i].b+mid*p[i].k;
		mx=max(mx,now);
		if(p[i].op) v2.push_back(now);
		else v1.push_back(mx);
	}
	
	sort(v1.begin(),v1.end());
	sort(v2.begin(),v2.end());
	int len=v1.size();
	for(int i=0;i<len;i++){
		if(v1[i]<v2[i]) return 0;
	}
	return 1;
}

int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>p[i].k>>p[i].b;
	for(int i=n+1;i<=n*2;i++) cin>>p[i].k>>p[i].b;
	for(int i=n+1;i<=n*2;i++) p[i].op=1;
	sort(p+1,p+1+n*2,cmp);
	
	ll l=0,r=1e9;
	while(l<=r) {
		ll mid=(l+r)>>1;
		if(check(mid)) r=mid-1;
		else l=mid+1;
	}
	if(l==1e9+1) cout<<"Can't win!";
	else cout<<l<<"\n";
} 

上一题