啊!我的推!你帅亖我了!(封面)
哈哈哈哈哈哈哈哈哈又是我
等等我先发个颠
没错叕是题目:
C . T h e D e l i v e r y D i l e m m a C. The Delivery Dilemma C.TheDeliveryDilemma
咳咳,思路 : : :
假设我们所有菜都让他们送过来,则 a n s ans ans= m a x max max( a 1 a_1 a1 , a 2 a_2 a2 ... , a N a_N aN),
不妨开一个 a n s ans ans表示当前自己去拿已经花费的时间,
由于自己买的时候花费时累加的,
我们先将 a 1 a_1 a1 , a 2 a_2 a2 , ... , a N a_N aN从大
到小排序,
若 a i > a n s + b i a_i > ans + b_i ai>ans+bi
则第 i i i个物品可以通过自己买来代替,否则直接输出答案。
AC时刻
cpp
#include <iostream> // 基本入出力ストリーム
#include <algorithm> // 一般的なアルゴリズム(ソート、ルックアップ、やり直し、二分ルックアップなど)
#include <vector> // 動的配列(スペースが足りないと自動的に拡張されます)
#include <queue> // スタック(先に入って先に出ます)
#include <stack> // スタック(先に入ってから出ます)
#include <set> // 集合(反復しない順序)です
#include <map> // キー値対コンテナ(マッピング)
#include <list> // 両方向リスト
#include <math.h> // すうがくかんすう
#include <functional> // 通用的函数绑定和调用机制一般的なバインディングと呼び出しの仕組み
#define endl '\n'
#define pii pair<int, int>
#define pdd pair<double, double>
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
using namespace std;
struct cjdl {
long long a, b;
} c[200005];
long long t = 0, n = 0;
bool cmp(cjdl x, cjdl y) { //a[i]和b[i],由a[i]从大到小排序
return x.a > y.a;
}
const int inf = 1e9 + 7;
const int mod = 998244353;
const int N = 2e5 + 10, M = N << 1;
void solve() {
// 竞赛程序
cin>>n;
for(int i = 1; i <= n; i++) {
cin >> c[i].a;
}
for(int i = 1; i <= n; i++) {
cin >> c[i].b;
}
sort(c + 1, c + n + 1, cmp);
bool flag = 0;
long long ans = 0;
for(int i = 1; i <= n; i++) {
if(c[i].a > ans + c[i].b) { //有a[i]>ans+b[i]
ans += c[i].b;//ans加上自己取的时间
} else { //否则直接输出答案
cout << max(c[i].a, ans) << endl;
flag = 1;
break;
}
}
if(!flag) {
cout << ans << endl;
}
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t = 1;
cin >> t; // 非多组测试数据请注释该行
while(t--) solve();
return 0;
}
最后我还要声明一下:
我到底还要说多少遍我写代码用的是CPP! ( ( (尖叫扭曲 ) ) )