Mujin Programming Challenge 2017题解

ポータル

\(\)

ナナは考え抜かにしかし、まだそれはいないようです......

まず、我々は数のためにことがわかった\(k個\) それは最初にすべてのために場合にのみに行ってきました\(I <K \)を満たす\(X_I \ GEQ 2I-1 \)我々は置くことができるように、すべての\(私は\)移動\(2I-1 \)当時とは聞かせて\(k個\)の上に直接、すべての方法。すべてのための場合と\(k個\)このような性質を持っている、答えは(N!\)\します

したがって、左から右へ掃引、スタック内の要素の現在のレコード数、現在の設定\(K \)スタックの\(Iは\)位置、および\(K \)は満たしていない\を(X_Kの\のGEQ 1-2i \) その後、我々は前に置かなければなりません(私は\)\ので、十分に係数を乗じ、残りの出会いの少なくとも数を、作るために取り除か番号を。最後に、スタックは、任意の順序にすることができ

//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の\)\

すべてのすべてではない黒の列列全体のために、我々は確かに彼らは、全体の列になってい黒です。また、見つけるのは難しい、そうでない場合は、我々は黒をすることはできませんどのように動作するか、行全体の黒のライン、。そう答えは回数行黒く最小化することである\(+ \)を整数列はブラック列の数がされていません

それでは、どのくらいの行数の最小値は、それがすべて黒にするのですか?この動作を設定します\(私は\) \(X \)白のチェック柄を、最初ので、もし\(私は\)黒の格子縞の列に、我々は明らかにすることができます(X \)\操作を、これはすべての行を変更します黒は、そうでなければ、する必要があります(X + 1 \)\余分な時間が最初に作ることであることを、時間を(私は\)\を黒のグリッドを示しています

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

おすすめ

転載: www.cnblogs.com/yuanquming/p/11532902.html