题目大意:给你n个人,每个人都要抽m张纸条
全部纸条中能中奖的纸条一共有k张,要求有p个人都抽中相同的中奖纸条数并且这个数要是所有抽奖人数里中奖数最大的数,问能不能成功
能则输出“YES”并输出分配情况,否则输出"NO"。具体问题信息请看题目
思路:模拟,注意情况就行了
首先我们可以这样想,将最多的中奖纸条变量设为ans
因为要求p个人都要抽中最多的中奖纸条,那肯定要ans=k/p首先进行分配
之后就对剩余的数字进行分配,但剩余数字分配肯定都必须小于k/p否则就不满足条件了
但是这里存在一个问题,关于m的情况我们还没考虑
比如这组输入数据:3 9 21 2
结果应该是:
YES
9 0
9 0
3 6
但是我们用k/p的时候得出的结果是10则不满足条件
因此应该设ans=min(k/p,m)以满足条件
同时剩下的中奖纸条我们看剩余人数有多少,如果剩下中奖纸条数大于ans-1就每次减去ans-1
否则减去中奖纸条数即可(一开始用剩下中奖纸条数/剩余人数······走了不少弯路,具体请看代码)
输出"NO"的条件就是看最后是否有剩余中奖纸条数即可
AC代码:
#include <iostream> using namespace std; long long ans2[100010]; int main() { long long n,m,k,p;//全部记号纸团加起来等于k,有p个人恰好抽中最多的记号,一共n个人,每个人抽m张 cin>>n>>m>>k>>p; long long ans=min(k/p,m); // cout<<ans<<' '<<p<<endl; long long temp=0; long long e=k-ans*p; temp=ans*p; long long cnt=n-p;//没抽到最大纸条的人数 long long x=-1; for(int i=0;i<cnt;i++){//剩余中奖纸条的处理 if(e>=ans-1){ e-=ans-1; ans2[i]=ans-1; } else{ ans2[i]=e; e=0; } } if(e>0)cout<<"NO"<<endl; else { cout<<"YES"<<endl; for(int i=0; i<p; i++) { cout<<ans<<' '<<m-ans<<endl; } int cnt=n-p; for(int i=0; i<cnt; i++) { cout<<ans2[i]<<' '<<m-ans2[i]<<endl; } } return 0; }