K - Mahjong Sorting ZOJ - 4034 18浙江省赛K

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38449464/article/details/80166294

1、Problem:

       https://vjudge.net/contest/287668#problem/K

       http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4034

2、tags:

       分类讨论 阅读理解

3、Mean:

       给出麻将的规则:正常麻将按大小排序.选出财神(lucky tile)后,把财神放到最前面.如果有白板(White dragon tile),则把白板当作财神原本值,在里面排序.(即放在财神原来的位置)

       现在给出一个麻将的序列,问财神可能有几种

4、Solution:

       要讨论的情况很多,建议在草稿纸上全部讨论完 再码

       注意,有财神的时候,财神一定是放在最前面

       先是无白板的情况

              如果乱序,ans=1

              如果正序,ans=3*m-n+1

              (为了方便判别正乱序都是那v[1],v[2]比大小) 所以还要额外讨论一种n==1,ans=3*m

       有白板:

              白板在第一位

                     如果n==1,ans=3*m

                     如果n>1,ans = 后一位前面的种数,不包含后一位

              白板在第二位

                     if n==2,ans=第一位后面的种数,包括第一位

                     if n>2, ans = v[3]-v[1] 包括第一位,不报第三位

              白板在第n位//最后一位

                     if 乱序,ans = 1;

                     if 正序,ans = 3*m-v[n-1] 不包前一位

              白板在中间//一定是>=3了

                     if 乱序,ans = 1

                     else ,ans = v[p+1]-v[p-1]-1 ,前后都不包

5、Mistakes:

      

6、Gains:

       模拟题把思路写完整,细节考虑周全,再开动

 

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N =1e5+10;
const ll mod=1e9;
int v[N];
int main(){
    int _;
    cin>>_;
    while(_--){
        int n,m,t;
        char c;
        cin>>n>>m;
        int f=0,p=0,ans=1;
        for(int i=1;i<=n;i++){
            getchar();
            c = getchar();
            if(c=='W') p=i;
            else{
                scanf("%d",&t);
                if(c=='C') v[i]=t;
                else if(c=='B') v[i]=m+t;
                else v[i]=2*m+t;
            }
        }
        if(p){//有白板
            if(p==1){
                if(n>1) ans=v[p+1]-1;
                else if(n==1) ans=3*m;
            }else if(p==2){
                if(n==2) ans = 3*m-v[1]+1;
                else ans=v[3]-v[1];
            }else if(p==n){
                if(v[1]>v[2]) ans=1;
                else ans=3*m-v[p-1];
            }else{
                if(v[1]>v[2]) ans=1;//乱序
                else ans = v[p+1]-v[p-1]-1;//正序
            }
        }else{//无白板
            if(n==1) ans=3*m;
            else{
                if(v[1]>v[2]) ans=1;
                else ans=3*m-n+1;
            }
        }
        cout<<ans<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_38449464/article/details/80166294