2019.01.30【NOIP提高组】模拟 B 组 总结

版权声明:请大家斧正,如喜欢的话,为拙见点一个赞吧。 https://blog.csdn.net/qq_39897867/article/details/86712877

题解

[jzoj 4255] ACM {DP+优化}

[jzoj 4256]平均数{二分答案+巧妙做法+前缀和优化}

[jzoj 4257] 着色 {组合计数}


今天,考得不好,能拿的分没有拿到。而且还看错了题目,第一题打了我好久的最小费用最大流——然而题目要去的是“非空的连续一段”第二道题,范围开小了——第三题莫名WA(我理解错题目的意思了!!!)(悲惨世界


比赛程序

第一题费用流

#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#define N 1010
#define INF (0x3f3f3f3f)
using namespace std;
int cnt,n,ans,head[N<<1],S,T; 
struct edge{int next,to,flow,cost;}a[N<<3];
struct mincostmaxflow{
	int d[N<<1],Mn[N<<1],fa[N<<1]; bool vis[N<<1]; queue<int>q; 
	int calc(){
		int res=0;
		while (1){
			memset(d,63,sizeof(d)); d[S]=0; Mn[S]=INF; q.push(S); 
			while (!q.empty()){
				int x=q.front(); q.pop(); vis[x]=0; 
				for (int i=head[x];~i;i=a[i].next){
					int to=a[i].to; 
					if (!a[i].flow||d[to]<=d[x]+a[i].cost) continue; 
					d[to]=d[x]+a[i].cost; fa[to]=i; Mn[to]=min(Mn[x],a[i].flow); 
					if (!vis[to]) vis[to]=1,q.push(to); 
				}
			}
			if (d[T]==INF) return res; 
			res+=d[T]*Mn[T]; int p=T; 
			while (p!=S){
				a[fa[p]].flow-=Mn[T]; 
				a[fa[p]^1].flow+=Mn[T]; 
				p=a[fa[p]^1].to; 
			}
		}
	}
}MCMF;
void add_edge(int from,int to,int flow,int cost){
	a[cnt]=(edge){head[from],to,flow,cost}; head[from]=cnt++;
	a[cnt]=(edge){head[to],from,0,-cost}; head[to]=cnt++;
}
int main(){
	memset(head,-1,sizeof(head)); 
	scanf("%d",&n); int k; 
	S=n+4; T=n+5; 
	for (int i=1;i<=3;i++)
	 for (int j=1;j<=n;j++)
	 {
		scanf("%d",&k); 
		add_edge(i+n,j,1,k); 
		add_edge(j,j+1,INF,k); 
	 }	
	for (int i=1;i<=3;i++) add_edge(S,i+n,1,0);
	for (int i=1;i<=n;i++) add_edge(i,T,1,0); 
	return 0&printf("%d",MCMF.calc()); 
}

第一题没有时间调试的暴力

#include<cstdio>
#include<algorithm>
#define fre(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout)
using namespace std;
int n,a[150001],q[150001],w[150001],e[150001],ans=1e8; 
int main(){
	fre(acm); 
	scanf("%d",&n);
	for (int i=1;i<=n;i++){scanf("%d",&q[i]); q[i]+=q[i-1];}
	for (int i=1;i<=n;i++){scanf("%d",&w[i]); w[i]+=w[i-1];}
	for (int i=1;i<=n;i++){scanf("%d",&e[i]); e[i]+=e[i-1];}
	for (int i=1;i<n;i++) 
	 for (int j=i+1;j<=n;j++){
	 	ans=min(ans,q[i]-q[0]+w[j]-w[i]+e[n]-e[j]); 
	 	ans=min(ans,w[i]-w[0]+e[j]-e[i]+q[n]-q[j]); 
	 	ans=min(ans,e[i]-e[0]+q[j]-q[i]+w[n]-w[j]); 
	 }
	printf("%d",ans); 
}

第二题暴力

#include<cstdio>
#include<algorithm>
#define fre(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout)
#define ll long long
using namespace std; 
ll n,k,a[30001]; double b[30001],ans; 
int main(){
	
	fre(average); 
	scanf("%lld%lld",&n,&k); 
	for(ll i=1;i<=n;i++) scanf("%lld",&a[i]),b[i]=b[i-1]+a[i]*1.0; 
	for(ll i=k;i<=n;i++) for (ll j=i;j<=n;j++) ans=max(ans,(b[j]-b[j-i])/(i*1.0)); 
	printf("%lf",ans); 
}

第三题WA程序

#include<cstdio>
#define fre(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout)
#define ll long long
using namespace std; 
ll n,k;
ll ksm(ll x,ll y){ll ret=1; for (;y;y>>=1,x*=x) if (y&1) ret*=x; return ret;}
ll huan(ll x,ll y){return ksm(y-1,x)+ksm(-1,x)*(y-1);}
int main(){
	fre(color);
	scanf("%lld%lld",&n,&k); 
    if (n==1){
       printf("%lld",k*ksm(k-1,19));
	} else if (n==2){
	   printf("%lld",huan(3,k)*2*ksm(k-1,3)); 			
	} else if (n==3){
	   printf("%lld",k*ksm(k-1,3)); 
	} else if (n==4){
	   printf("%lld",k*ksm(k-1,13)); 
	} else if (n==5){
	   printf("%lld",huan(3,k)*2); 
	} else if (n==6){
		
	} else if (n==7){
	   printf("%lld",huan(3,k)*2*ksm(k-1,3)); 	
	} else if (n==8){
	   printf("%lld",huan(30,k)); 
	}
}

猜你喜欢

转载自blog.csdn.net/qq_39897867/article/details/86712877