【noip2011】

noip2011

铺地毯

应该从后往前判断该地毯是否覆盖

struct node{int x,y,n,m;}a[N];
int main(){
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
#endif
	rd(n);
	for(int i=1;i<=n;++i) rd(a[i].x),rd(a[i].y),rd(a[i].n),rd(a[i].m);
	rd(x),rd(y);
	for(int i=1;i<=n;++i)
	if((a[i].x<=x&&a[i].y<=y)&&(a[i].x+a[i].n>=x)&&(a[i].y+a[i].m>=y)) ans=i;
	printf("%d",ans);
	return 0;

选择客栈

用一个桶来装该种颜色的客栈有多少个可以配对 每找到一个新的可配对客栈 将其与前面一段的都++

int main(){
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
#endif
	rd(n),rd(m),rd(k);
	for(int i=1;i<=n;++i) rd(a[i]),rd(p[i]);
	for(int i=1,lst=0;i<=n;++i){
		if(p[i]<=k){for(int j=lst+1;j<=i;++j) ++cnt[a[j]];lst=i;}
		ans+=cnt[a[i]],ans-=(p[i]<=k);
	}
	printf("%lld",ans);
	return 0;
}

Mayan游戏

神烦搜索==

写一个删除函数、掉落函数 然后还有一些细节

注意移动的时候左边有块的话就不用移动了 因为它左移和它左边的块左移是等价的

struct node{int x,y,d;}ans[10];
void print(){for(int i=1;i<=n;++i) printf("%d %d %d\n",ans[i].x-1,ans[i].y-1,ans[i].d);exit(0);}

void count(){for(int i=1;i<=5;++i){mp[i][0]=0;while(mp[i][mp[i][0]+1])mp[i][0]+=1;}}
void fall(){
    for(int i=1,cnt;i<=5;++i){
        cnt=0;
        for(int j=1;j<=7;++j)
            if(mp[i][j]) mp[i][++cnt]=mp[i][j];
        for(int j=cnt+1;j<=7;++j) mp[i][j]=0;mp[i][0]=cnt;
    }
}
bool tg[7][9],ok;
void delet(){
    count();memset(tg,0,sizeof(tg)),ok=0;
    for(int i=2;i<=4;++i)
        for(int j=1;j<=mp[i][0];++j)
            if(mp[i][j]==mp[i-1][j]&&mp[i][j]==mp[i+1][j]) tg[i][j]=tg[i-1][j]=tg[i+1][j]=1;
    for(int i=1;i<=5;++i)
        for(int j=2;j<mp[i][0];++j)
            if(mp[i][j]==mp[i][j-1]&&mp[i][j]==mp[i][j+1]) tg[i][j]=tg[i][j-1]=tg[i][j+1]=1;
    for(int i=1;i<=5;++i)
        for(int j=1;j<=mp[i][0];++j)
            if(tg[i][j]) mp[i][j]=0,ok=1;
    fall();if(ok) delet();
}

bool finsh(){for(int i=1;i<=5;++i)if(mp[i][0]) return 0;return 1;}
void dfs(int x){
    if(x==n+1){if(finsh()) print();return;}
    if(finsh()) return;
	int ret[10][10];memcpy(ret,mp,sizeof(mp));
    for(int i=1;i<=5;++i)
        for(int j=1;j<=mp[i][0];++j){
            if(i!=5){
                swap(mp[i][j],mp[i+1][j]);
                fall(),delet(),ans[++tt]=(node){i,j,1},dfs(x+1);
				--tt,memcpy(mp,ret,sizeof(mp));
            }
            if(i!=1&&!mp[i-1][j]){
                swap(mp[i][j],mp[i-1][j]);
                fall(),delet(),ans[++tt]=(node){i,j,-1},dfs(x+1);
				--tt,memcpy(mp,ret,sizeof(mp));
            }
        }
}
int main(){
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
#endif
    rd(n);
    for(int i=1;i<=5;++i)
		while(rd(mp[i][++mp[i][0]]),mp[i][mp[i][0]]);
    for(int i=1;i<=5;++i) mp[i][0]-=1;
    dfs(1),puts("-1");
    return 0;
}

计算系数

根据二项式定理:\((a+b)^n=\sum\limits_{k=0}^n{n\choose k}a^kb^{n-k}\)

复习一下杨辉三角?

int main(){
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
#endif
	rd(a),rd(b),rd(k),rd(n),rd(m);
	for(int i=1;i<=k;++i){
		c[i][0]=c[i][i]=1;
		for(int j=1;j<i;++j) c[i][j]=(c[i-1][j]+c[i-1][j-1])%P;
	}
	ans=qpow(a%P,n)*qpow(b%P,m)%P;
	printf("%d",ans*c[k][n]%P);
    return 0;
}

聪明的质检员

二分

struct node{int l,r;}q[N];
int sum[N];ll sv[N];
ll check(int mid){
	for(int i=1;i<=n;++i)
		if(w[i]>=mid) sum[i]=1,sv[i]=v[i];
		else sum[i]=sv[i]=0;
	for(int i=1;i<=n;++i) sum[i]+=sum[i-1],sv[i]+=sv[i-1];
	ll ret=0;
	for(int i=1,l,r;i<=m;++i) ret+=((ll)sum[r=q[i].r]-sum[l=q[i].l-1])*(sv[r]-sv[l]);
	return ret;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
#endif
	rd(n),rd(m),rd(K);
	for(int i=1;i<=n;++i) rd(w[i]),rd(v[i]);
	for(int i=1;i<=m;++i) rd(q[i].l),rd(q[i].r);
	int l=0,r=1000000,mid;ll ret;
	while(l<=r){
		mid=l+r>>1,ret=check(mid),ans=min(ans,abs(ret-K));
		if(!ans) return puts("0"),0;
		if(ret>K) l=mid+1;
		else r=mid-1;
	}
	printf("%lld",ans);
    return 0;
}

观光公交

每次修改一条路\(i\) 它只会影响到达景点\(i+1\)以及它之后的连续的会出现”人等车“的情况的景点 若景点\(i+1\)之后出现一个景点是\(x\)"车等人"的情况那么这条路权值减少就会不影响到景点\(x\)及其之后的景点

那么每次贪心减去影响最大的那条边

int main(){
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
#endif
    rd(n),rd(m),rd(k);
    for(int i=1;i<n;++i) rd(d[i]);
    for(int i=1;i<=m;++i){
        rd(t[i]),rd(fr[i]),rd(to[i]);
        las[fr[i]]=Max(las[fr[i]],t[i]),++dw[to[i]];
    }
    for(int i=1;i<=n;++i) sum[i]=sum[i-1]+dw[i];
    for(int i=1,nw=0;i<=n;++i) lef[i]=nw=Max(las[i],nw),nw+=d[i];
    for(int i=1;i<=m;++i) ans+=((ll)lef[to[i]-1]+d[to[i]-1])-t[i];
    while(k--){
        for(int i=1,nw=0;i<=n;++i) lef[i]=nw=Max(las[i],nw),nw+=d[i];
        eff[n-1]=n;//第i条边改变 会影响到的最远城市 
        for(int i=n-2,arr;i;--i){
            arr=lef[i]+d[i];
            if(arr>las[i+1]) eff[i]=eff[i+1];
            else eff[i]=i+1;
        }
        int mx=0,pos=0;
        for(int i=1;i<n;++i)
            if(d[i]&&sum[eff[i]]-sum[i]>mx) mx=sum[eff[i]]-sum[i],pos=i;
        ans-=mx,--d[pos];
    }
    printf("%lld",ans);
    return 0; 
}
posted @ 2019-10-31 08:46  委屈的咸鱼鱼鱼鱼  阅读(321)  评论(0编辑  收藏  举报