比赛的时候卡E卡太久,心态崩了,太紧张的结果就是这题的思路也理不顺,赛后写着感觉还不错的= =+
还是代码经验太少了。。。
WA了两次,第一次特判会长大人被数到的次数的时候if/else写串了,第二次是判断n<=2的情况里面ans是否要加1的条件左边漏了*m...总而言之大意了
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int t;
long long n,m,d,x,y;
ll ma[105],mi[105];
int main()
{
scanf("%d",&t);
while(t--){
memset(ma,0,sizeof(ma));
memset(mi,0,sizeof(mi));
scanf("%lld%lld%lld%lld%lld",&n,&m,&d,&x,&y);
ll rownum,colnum;
ll rowtime,rowyu;
ll ans1,ans2,ans3;
ans1=ans2=ans3=0;
rownum=d/m;//能完整的数几行
colnum=d%m;//剩下还能数多少个人
if(rownum<n||rownum==n&&!colnum){//一次内可以数完
//最多
ans1=1;
//最少
if(rownum==n&&!colnum) ans2=1;
else ans2=0;
//会长
if((x-1)*m+y<=d) ans3=1;
else ans3=0;
}
else{
if(n<=2){//这种情况相当于循环计数,特殊判断
if(n==1){
ans1=ans2=ans3=rownum;
if(colnum) ans1+=1;
if(y<=colnum) ans3+=1;
}
else{
ans1=ans2=ans3=rownum/2;
// printf("*");
// printf(" %lld %lld %lld %lld %lld\n",ans1,ans2,ans3,rownum/2*2,d);
if(rownum/2*2*m<d) ans1+=1;//这里的判断写错了几次。。。
if(rownum%2*m+colnum>=(x-1)*m+y) ans3+=1;
}
}
else{
for(int i=0;i<n;i++) ma[i]=mi[i]=1;
rowtime=(rownum-n)/(n-1);//能完整数几个来回
rowyu=(rownum-n)%(n-1);//剩下还要数几行
ma[0]+=(rowtime+1)/2;
ma[n-1]+=(rowtime)/2;
mi[0]+=(rowtime+1)/2;
mi[n-1]+=(rowtime)/2;
for(int i=1;i<n-1;i++){
ma[i]+=rowtime;
mi[i]+=rowtime;
}
if(rowtime%2){
for(int i=1;i<=rowyu;i++){
ma[i]+=1;
mi[i]+=1;
}
if(colnum){//还有要数的人的话,就是在下一行了
ma[rowyu+1]+=1;
}
}
else{
for(int i=n-2;i>=n-1-rowyu;i--){
ma[i]+=1;
mi[i]+=1;
}
if(colnum){
ma[n-2-rowyu]+=1;
}
}
/* for(int i=0;i<n;i++){
printf(" %lld %lld \n",ma[i],mi[i]);
}*/
ans1=ma[0];ans2=mi[0];
for(int i=0;i<n;i++){
ans1=max(ans1,ma[i]);
ans2=min(ans2,mi[i]);
if(i==x-1){
if(ma[i]!=mi[i]){
if(y<=colnum) ans3=ma[i];
else ans3=mi[i];
}
else ans3=ma[i];//这个else应该是写在大if里面的,一开始写错了
}
}
}
}
printf("%lld %lld %lld\n",ans1,ans2,ans3);
}
return 0;
}
/*
555
1 3 8 1 1
4 2 9 4 2
1 1 1 1 1
4 4 29 2 1
2 2 8 2 2
3 2 3
2 1 1
1 1 1
*/