> 咕咕咕!咕了很久的博客终于更新了!
CF720A Closing ceremony
题目大意
> N×M个座位有N×M个人,一开始有 k人在(0,0)点上,l个人在(0,m+1)点上,问是否存在一种方案,使得每个人分配点与起始点的曼哈顿距离小于体力值,且每个人都有位置坐。
思路
贪心,考虑把两个起始点的人尽量往两个角塞
先把第一波人按照体力值从小到大排序
> 为什么不是从大到小排呢?如果体力值大的人把角落塞满了,体力值小的人又走不远,就没地方去了
然后先把位置先分配前 K K K 人(当然也可以先分配给后 L L L 人)。为了给后 L L L 人留够空间,分配时离 ( 0 , m + 1 ) (0, m+1) (0,m+1) 点越远越好,若路程相同则选择离起点越远越好。
再分配后 L L L ,离起点越远越好。
若可行区间内节点都已选择,输出“NO”,否则输出“YES”。
(PS:这道题的算法标签为什么是排序、队列???)
Code(请勿Ctrl+C/V)
// Problem: CF720A Closing ceremony
// URL: https://www.luogu.com.cn/problem/CF720A
// Memory Limit: 250 MB
// Time Limit: 2000 ms
// Author: arlenWKX
# include <bits/stdc++.h>
using namespace std;
const int NM = 10005;
int n, m, k, l, a [ NM ], b [ NM ];
bool used [ NM ] [ NM ];
bool __CF720A__ ( );
int main ( )
{
scanf ( "%d%d", & n, & m );
scanf ( "%d", & k );
for ( int i = 1; i <= k; i ++ ) scanf ( "%d", & a [ i ] )