NC232438. [NCT058C1]简单题
描述
输入描述
第一行一个正整数接下来 行,每行两个整数 ,表示你现在拥有的堡垒的参数。
接下来 行,每行两个整数 ,表示目标堡垒的参数。
输出描述
一个非负整数表示答案,或一个字符串 "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"; }