Mujin Programming Challenge 2017题解

传送门

\(A\)

似乎并不难啊然而还是没想出来……

首先我们发现对于一个数\(k\),它能第一个走到当且仅当对于每一个\(i<k\)满足\(x_i\geq 2i-1\),这样我们就可以把所有的\(i\)移到\(2i-1\)然后让\(k\)直接一路过去了。而如果对于每个\(k\)都有这个性质,答案就是\(n!\)

所以从左往右扫,记录当前栈中的元素个数,设当前的\(k\)在栈中的第\(i\)个位置,且\(k\)不满足\(x_k\geq 2i-1\),那么我们必须把前\(i\)个数中移出至少一个才能使剩下的数满足,所以乘上一个系数就好了。最后栈中是可以任意顺序的

//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int P=1e9+7;
inline void upd(R int &x,R int y){(x+=y)>=P?x-=P:0;}
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){
    R int res=1;
    for(;y;y>>=1,x=mul(x,x))(y&1)?res=mul(res,x):0;
    return res;
}
const int N=2e5+5;
int x[N],n,res,cnt;
int main(){
    scanf("%d",&n),res=1;
    fp(i,1,n)scanf("%d",&x[i]);
    fp(i,1,n){
        if(x[i]<(cnt<<1|1))res=mul(res,cnt+1);
        else ++cnt;
    }
    fp(i,1,cnt)res=mul(res,i);
    printf("%d\n",res);
    return 0;
}

\(B\)

首先如果整个网格全是白色显然\(gg\)

对于所有不是整列都黑的列,我们肯定得把它们变得整列都黑。而且不难发现,若是没有整行都黑的一行,我们怎么操作都不可能使得一列变黑。所以答案就是使得某一行变黑的最小次数\(+\)不是整列都黑的列数

那么对于一行使其全部变黑的最小次数是多少呢?设这一行为\(i\),其中有\(x\)个白色格子,那么如果第\(i\)列有黑色格子,我们显然可以通过\(x\)次操作使得这一行全部变黑,否则的话就需要\(x+1\)次,多出来的那一次就是为了让第\(i\)列有一个黑色格子

//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int N=505;
char s[N][N];int vis[N],mm[N],n,res,cnt,fl;
int main(){
    scanf("%d",&n);
    fp(i,1,n)scanf("%s",s[i]+1);
    fp(i,1,n)fp(j,1,n)if(s[i][j]=='#')fl=1,vis[j]=1,++mm[j];
    if(!fl)return puts("-1"),0;
    fp(i,1,n)mm[i]=(mm[i]==n?1:0),cnt+=mm[i];
    res=233333;
    fp(i,1,n){
        R int c=0;
        fp(j,1,n)c+=s[i][j]=='.';
        cmin(res,n-cnt+c+(vis[i]^1));
    }
    printf("%d\n",res);
    return 0;
} 
上一篇:【csp模拟赛1】不服来战 (challenge.cpp)


下一篇:Ozon Tech Challenge 2020 (Div.1 + Div.2, Rated, T-shirts + prizes!) F. Kuroni and the Punishment