zjnu校赛F 会长大人上课

比赛的时候卡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


*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值