正文
题面
link
一串的式子,乍一看还挺吓人的。但是说白了就是构造
p
p
p 个 大于其它的
n
−
p
n-p
n−p 个
x
i
x_{i}
xi 的
x
i
x_{i}
xi。
思路
第一反应是鸽笼原理,那贪心思路就有了:给前 p p p 个数设的尽可能大(设最大值为 t t t),剩下的数每个塞 t − 1 t-1 t−1,直到用完为止。
实现
#include <iostream>
#define int long long //不是一个好习惯,但是比赛还是很有用的(笔者今年但凡CSPS2写这一句,就省一了。。。)这里开long long是因为k超了int
using namespace std;
int n,m,k,p;
signed main()//signed是int的“小名”
{
cin>>n>>m>>k>>p;
int t=min(k/p,m);//带记号纸团分摊到p个人头上 和 每个人抽的纸条数 的最小值
if(k-p*t>(t-1)*(n-p))//如果剩余带记号纸条摊给剩下n-p人摊不下
{
cout<<"NO"<<endl;
}
else
{
cout<<"YES"<<endl;
for(int i=1;i<=p;i++)//先构造p个最大的
{
cout<<t<<" "<<m-t<<endl;
}
k-=p*t;
for(int i=p+1;i<=n;i++)
{
if(k>=t)//先尽可能多摊
{
cout<<t-1<<" "<<m-t+1<<endl;
k-=t-1;
}
else//剩余要分的小于t了
{
cout<<k<<" "<<m-k<<endl;
k=0;
}
}
}
return 0;
}
总结
这个贪心题思路还是总体好想的,代码实现难度也不大。但是题面较长且读起来比较吓唬人,给人一种“这真的是橙题?!”的错觉。
当然,这确确实实是我“童年阴影”,有图为证:
今天看到题面就想起了当时鸭蛋的场景,有点怂,但是真做了也还好。回过头看当年的代码,明显是没理解透就动键盘,式子打的漏洞百出。
所以做这类题还是静态调试,理清思路为主,别闷着头单步调试迷迷糊糊的拆东墙补西墙,没用!