luogu P9556 [SDCPC2023] A-Orders 题解
简单题,建议评红。
题意
某工厂在第 \(1\) 天开工之前收到了 \(n\) 笔订单,第 \(i\) 笔订单可以用两个整数 \(a_i\) 和 \(b_i\) 描述,表示工厂需要在第 \(a_i\) 天结束时交付 \(b_i\) 件货物。
已知工厂每天能生产 \(k\) 件货物,且第 \(1\) 天开工之前没有任何存货,问该工厂能否完成所有订单。
思路
- 开一个结构体数组,存下订单信息;
- 根据开工天数大小排序;
- 检查利用整数 \(last\) 存储囤积, \(now\) 存储最晚订单,推出任意时刻是否合法;
- 注意开
long long
。
时间复杂度瓶颈在排序,为 \(O(n\log n)\)。
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 102;
struct node{
int A,B;
}a[maxn];
int Read();
int T,n,k,last,now,flag;
bool cmp(node x,node y){
return x.A < y.A;
}
signed main(){
T = Read();
while(T--){
last = 0; now = 0; flag = 1;
n = Read(); k = Read();
for(int i = 1;i <= n;++i)
a[i].A = Read(),a[i].B = Read();
sort(a + 1,a + n + 1,cmp);
for(int i = 1;i <= n;++i){
if(flag) last = (last + (a[i].A - now) * k - a[i].B);
if(last < 0) flag = 0;
now = a[i].A;
}
if(flag) cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}
int Read(){
char c = getchar();
int x = 0,f = 1;
while(c < '0' || c > '9'){
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9'){
x = x * 10 + c - '0';
c = getchar();
}
return x * f;
}