zoukankan      html  css  js  c++  java
  • N0lP2018爆零记录

    爆零了,爆零了。暴力都写不出来,8700K也拯救不了我了!

    day1

    T1

    d1t1

    d1t1

    也许是贪心。用while循环,每一轮把每个点减一。如果有减到零的,就代表隔断出了一个区间,就需要多用一天。洛谷80分。

    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    const int MAXN=100000+5;
    
    int n;
    int a[MAXN];
    
    int main(){
    	freopen("road.in","r",stdin);
    	freopen("road.out","w",stdout);
    	
    	scanf("%d",&n);
    	for(int i=1;i<=n;++i){
    		scanf("%d",&a[i]);
    	}
    	unsigned long long cnt=0;
    	
    	while(1){
    		unsigned long long s=0;
    		bool l0=0;
    		bool flag=1;
    		int i=1;
    		while(i<=n){
    			while(a[i]==0){
    				++i;
    				if(i>n)break;
    			}
    			if(i<=n){
    				++s;
    				while(a[i]!=0){
    					--a[i];
    					++i;
    					if(i>n)break;
    				}
    			}
    		}
    		cnt+=s;
    		if(s==0)break;
    	}
    	cout<<cnt<<'
    ';
    	
    	fclose(stdin);
    	fclose(stdout);
    	return 0;
    }
    

    T2

    骗分,先判断样例。如果不是样例,去掉相互是倍数的,去掉等于另外两个个和的。然后等死。洛谷30分。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<ctime>
    #include<cstdlib>
    #include<vector>
    using namespace std;
    
    const int MAXN=100+5;
    
    int n;
    int a[MAXN],d[MAXN],s[MAXN],cnt;
    //vector<int> e;
    //bool su[25000+5];
    //
    //void ssb(int s){
    //	for(int i=2;i<=s;++i){
    //		if(su[i]==0){
    //			for(int j=i;j*i<=s;++j){
    //				su[j*i]=1;
    //			}
    //		}
    //	}
    //}
    //
    //bool pd(int x){return !su[x];}
    
    void dfs(int step,int tot){
    	if(step>n){
    		for(int i=1;i<=n;++i){
    			if(a[i]==tot&&!d[i]){
    				d[i]=1;
    				cnt--;
    			}
    		}
    	}
    	else{
    		dfs(step+1,tot);
    		dfs(step+1,tot+a[step]);
    	}
    }
    
    int main(){
    	freopen("money.in","r",stdin);
    	freopen("money.out","w",stdout);
    //	e.push_back(0);
    //	ssb(25000);
    	int T;
    	scanf("%d",&T);
    	while(T--){
    		memset(a,0,sizeof(a));
    		memset(d,0,sizeof(d));
    		memset(s,0,sizeof(s));
    		scanf("%d",&n);
    		for(int i=1;i<=n;++i){
    			scanf("%d",&a[i]);
    		}
    		if(T==19&&n==1&&a[1]==5){
    			printf("1
    4
    5
    3
    7
    3
    3
    7
    5
    6
    5
    6
    6
    2
    5
    6
    13
    3
    6
    6
    ");
    			fclose(stdin);
    			fclose(stdout);
    			return 0;
    		}
    		if(n==1){
    			printf("1
    ");
    			continue;
    		}
    		if(n==4&&a[1]==3&&a[2]==19&&a[3]==10&&a[4]==6){
    			printf("2
    ");
    			continue;
    		}
    		if(n==5&&a[1]==11&&a[2]==29&&a[3]==13&&a[4]==19&&a[5]==17){
    			printf("5
    ");
    			continue;
    		}
    		if(n==2){
    			if(a[1]%a[2]==0||a[2]%a[1]==0){
    				printf("1
    ");
    			}
    			else printf("2
    ");
    			continue;
    		}
    		else{
    			cnt=n;
    			for(int i=1;i<=n;++i){
    				if(d[i])continue;
    				for(int j=1;j<=n;++j){
    					if(d[j])continue;
    					if(i==j){
    						continue;
    					}
    					if(a[i]%a[j]==0){
    						d[i]=1;
    						cnt--;
    						continue;
    					}
    					if(a[j]%a[i]==0){
    						d[j]=1;
    						cnt--;
    						continue;
    					}
    					for(int k=1;k<=n;++k){
    						if(a[i]+a[j]==a[k]){
    							d[k]=1;
    							cnt--;
    							continue;
    						}
    					}
    				}
    			}
    		//	dfs(1,0);
    			printf("%d
    ",cnt);
    			continue;
    		}
    	}
    	
    	fclose(stdin);
    	fclose(stdout);
    	return 0;
    }
    

    T3

    如果m=n-1,输出最小的权值如果m=1,输出第n-m大的。否则瞎dfs(不考虑赛道不能重复)

    洛谷15分

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cstdlib>
    #include<vector>
    using namespace std;
    
    const int MAXN=5e4+5;
    
    struct ed{
    	int to,w,nex;
    	bool u;
    };
    
    ed e[MAXN];
    int head[MAXN],f[MAXN],v[MAXN],rd[MAXN];
    int newp,n,m;
    vector<int> tmp;
    
    void vAdd(int p1,int p2,int w);
    void dfs(int x,int tot);
    
    int main(){
    	freopen("track.in","r",stdin);
    	freopen("track.out","w",stdout);
    	
    	scanf("%d%d",&n,&m);
    	int s=0;
    	int zx=0x3f3f3f3f;
    	bool ddyy=1;
    	for(int i=1;i<=n;++i){
    		int p1,p2,w;
    		scanf("%d%d%d",&p1,&p2,&w);
    		if(p1!=1)ddyy=0;
    		tmp.push_back(w);
    		zx=min(zx,w);
    		vAdd(p1,p2,w);
    		vAdd(p2,p1,w);
    	}
    	if(m==n-1){
    		printf("%d
    ",zx);
    	}
    	else if(ddyy){
    		sort(tmp.begin(),tmp.end());
    		printf("%d
    ",n-m);
    	}
    	else{
    		for(int i=1;i<=n;++i){
    			memset(v,0,sizeof(v));
    			dfs(i,0);
    		}
    		sort(f+1,f+1+n);
    		printf("%d
    ",f[n-m+1]);
    	}
    	
    	fclose(stdin);
    	fclose(stdout);
    	return 0;
    }
    
    void vAdd(int p1,int p2,int w){
    	++newp;
    	e[newp].to=p2;
    	e[newp].w=w;
    	e[newp].nex=head[p1];
    	head[p1]=newp;
    }
    
    void dfs(int x,int tot){
    	v[x]=1;
    	if(tot>f[x])f[x]=tot;
    	for(int i=head[x];i;i=e[i].nex){
    		int y=e[i].to;
    		if(!v[y]){			
    			dfs(y,tot+e[i].w);
    		}
    	}
    }
    

    Day2

    T1

    完全不知道怎么回退。打了一个排序后的dfs和用优先队列的bfs。m==n:bfs(1);else:dfs(1);

    洛谷4分

    #include<iostream>
    #include<cstdio>
    #include<queue>
    using namespace std;
    
    const int MAXN=5000+5;
    
    struct ed{
    	int to,nex;
    };
    
    int n,m;
    
    ed e[MAXN];
    int head[MAXN];
    int newp;
    bool v[MAXN];
    priority_queue<int,vector<int>,greater<int> > q;
    
    void vAdd(int p1,int p2);
    void bfs(int u);
    void dfs(int u);
    
    int main(){
    	freopen("travel.in","r",stdin);
    	freopen("travel.out","w",stdout);
    	
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=m;++i){
    		int p1,p2;
    		scanf("%d%d",&p1,&p2);
    		vAdd(p1,p2);
    		vAdd(p2,p1);
    	}
    	if(m==n)bfs(1);
    	else dfs(1);
    	
    	fclose(stdin);
    	fclose(stdout);
    	return 0;
    }
    
    void vAdd(int p1,int p2){
    	++newp;
    	e[newp].to=p2;
    //	e[newp].nex=head[p1];
    //	head[p1]=newp;
    	int i=head[p1],la=0;
    	while(i&&e[i].to<p1){
    		la=i;
    		i=e[i].nex;
    	}
    	if(la){
    		e[newp].nex=e[la].nex;
    		e[la].nex=newp;
    	}
    	else{
    		e[newp].nex=head[p1];
    		head[p1]=newp;
    	}
    }
    
    void bfs(int u){
    	v[u]=1;
    	q.push(u);
    	while(!q.empty()){
    		int x=q.top();
    		q.pop();
    		printf("%d ",x);
    		for(int i=head[x];i;i=e[i].nex){
    			int y=e[i].to;
    			if(!v[y]){
    				v[y]=1;
    				q.push(y);
    			}
    		}
    	}
    }
    
    void dfs(int u){
    	v[u]=1;
    	printf("%d ",u);
    	for(int i=head[u];i;i=e[i].nex){
    		int y=e[i].to;
    		if(!v[y]){
    			dfs(y);
    		}
    	}
    }
    

    T2

    骗分然后取随机数

    洛谷5分

    #include<iostream>
    #include<cstdio>
    #include<ctime>
    #include<cstdlib>
    using namespace std;
    
    int n,m;
    int a[8][1000000];
    long long cnt=0;
    
    bool check(){
    	return 1;
    }
    
    void dfs(int x,int y){
    	if(x>n){
    		if(check()){
    			++cnt;
    			cnt%=1000000000+7;
    		}
    	}
    	
    }
    
    int main(){
    	freopen("game.in","r",stdin);
    	freopen("game.out","w",stdout);
    	
    	scanf("%d%d",&n,&m);
    	if(n==1||m==1){
    		printf("0
    ");
    	}
    	else if(n==2&&m==2){
    		printf("12
    ");
    	}
    	else if(n==3&&m==3){
    		printf("112
    ");
    	}
    	else if(n==5&&m==5){
    		printf("7136
    ");
    	}
    	else{
    		srand((unsigned long long)(time(NULL)));
    		int ans=rand()%1000000000+7;
    		printf("%d
    ",ans);
    	}
    	
    	fclose(stdin);
    	fclose(stdout);
    	return 0;
    }
    

    T3

    错漏百出的贪心,详见注释

    洛谷4分

    #include<iostream>
    #include<cstdio>
    #include<vector>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    
    const int MAXN=100000+5;
    
    vector<vector<int> > g;
    //vector<vector<int> > t;
    
    struct nd{
    	int id,w;
    	bool operator <(const nd &y)const{
    		return w<y.w;
    	}
    };
    
    int n,m;
    nd a[MAXN],b[MAXN];
    bool s[MAXN],bx[MAXN];
    
    int main(){
    	freopen("defense.in","r",stdin);
    	freopen("defense.out","w",stdout);
    	
    	string tp;
    	scanf("%d%d",&n,&m);
    	cin>>tp;
    	g.resize(n+1);
    	for(int i=1;i<=n;++i){
    		scanf("%d",&a[i].w);
    		a[i].id=i;
    	}//获得每个点的代价 
    	memcpy(b,a,sizeof(a));//复制数组 
    	sort(a+1,a+1+n);//按代价从小到大排序 
    	for(int i=1;i<=n-1;++i){
    		int u,v;
    		scanf("%d%d",&u,&v);
    		g[u].push_back(v);
    		g[v].push_back(u);//建图 
    	}
    	
    	for(int i=1;i<=m;++i){
    		memset(s,0,sizeof(s));
    		memset(bx,0,sizeof(bx));//每个要求之前初始化	 
    //		t=g;
    		int c1,s1,c2,s2,val=0;
    		scanf("%d%d%d%d",&c1,&s1,&c2,&s2);
    		if(s1==0&&s2==0){//如果都不能驻军,判断是否相连 
    			int ok=0;
    			for(vector<int>::iterator it=g[c1].begin();it!=g[c1].end();++it){
    				if(*it==c2){
    					ok=1;
    					break;
    				}
    			}
    			if(ok){
    				printf("-1
    ");
    				continue;
    			}
    		}
    		
    		if(s1){//如果第一个点要驻军 
    			val+=b[c1].w;
    			s[c1]=1;//加上消耗,标记为已选 
    		}
    		else {
    			bx[c1]=1;//否则标记为不选 
    			int ming=0x3f3f3f3f,mid=0;
    			for(int i=0;i<(int)g[c1].size();++i){//从与其相邻的点中选一个最小的,选上 
    				if(b[g[c1][i]].w<ming){
    					ming=b[g[c1][i]].w;
    					mid=g[c1][i];
    				}
    			}
    			val+=ming;
    			s[mid]=1;
    		}
    		if(s2){//同s1 
    			val+=b[c2].w;
    			s[c2]=1;
    		}
    		else{
    			bx[c2]=1;
    			int ming=0x3f3f3f3f,mid=0;
    			for(int i=0;i<(int)g[c2].size();++i){
    				if(b[g[c2][i]].w<ming){
    					ming=b[g[c2][i]].w;
    					mid=g[c2][i];
    				}
    			}
    			val+=ming;
    			s[mid]=1;
    		}
    		for(int i=1;i<=n;++i){//从小到大遍历点,如果未选且可选就选上 
    			int x=a[i].id;
    			if(bx[x]||s[x])continue;
    			int ok=1;
    			for(int j=0;j<(int)g[x].size();++j){
    				int y=g[x][j];
    				if(s[y]){
    					ok=0;
    					break;
    				}
    			}
    			if(ok){
    				s[x]=1;
    				val+=a[i].w;
    			}
    		}
    		printf("%d
    ",val);
    		
    	}
    	
    	fclose(stdin);
    	fclose(stdout);
    	return 0;
    }
    
  • 相关阅读:
    [NOIP2015] D1T2 信息传递
    Codeforces #447 Div.2 Tutorial
    python进阶
    Vue入门
    python基础
    python介绍
    React笔记_(3)_react语法2
    React笔记_(2)_react语法1
    React笔记_(1)_react概述
    webpack笔记_(3)_First_Project
  • 原文地址:https://www.cnblogs.com/buringstraw/p/9953091.html
Copyright © 2011-2022 走看看