luogu P9556 [SDCPC2023] A-Orders 题解

简单题,建议评红。

原题链接

题意

某工厂在第 \(1\) 天开工之前收到了 \(n\) 笔订单,第 \(i\) 笔订单可以用两个整数 \(a_i\)\(b_i\) 描述,表示工厂需要在第 \(a_i\) 天结束时交付 \(b_i\) 件货物。

已知工厂每天能生产 \(k\) 件货物,且第 \(1\) 天开工之前没有任何存货,问该工厂能否完成所有订单。

思路

  1. 开一个结构体数组,存下订单信息;
  2. 根据开工天数大小排序;
  3. 检查利用整数 \(last\) 存储囤积, \(now\) 存储最晚订单,推出任意时刻是否合法;
  4. 注意开 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;
}
posted @ 2023-08-23 09:49  CultReborn  阅读(18)  评论(0)    收藏  举报