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;
}
}