• 2019 Petrozavodsk Winter Camp, Yandex Cup 解题报告


    H


    签到题,每行最小值的最大值就是答案。


    #include <bits/stdc++.h>
    
    using namespace std;
    
    #define ll long long
    ll input(){
    	ll x=0,f=0;char ch=getchar();
    	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
    	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    	return f? -x:x;
    }
    
    int n;
    ll Ans,tmp;
    
    int main(){
    	n=input();
    	for(int i=1;i<=n;i++){
    		tmp=0x3f3f3f3f;
    		for(int j=1;j<=n;j++)
    			tmp=min(tmp,input());
    		Ans=max(tmp,Ans);
    	}
    	printf("%lld
    ",Ans);
    }
    

    A


    贪心,每次选择增量最小的点。


    #include <bits/stdc++.h>
    
    using namespace std;
    
    #define ll long long
    ll input(){
    	ll x=0,f=0;char ch=getchar();
    	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
    	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    	return f? -x:x;
    }
    
    #define PII pair<int,int>
    #define fr first
    #define sc second
    #define mp make_pair
    
    const int N=3e5+7;
    
    struct node{
    	int x,y;
    	int id;
    	bool operator <(const node &t)const{
    		return x+y>t.x+t.y;
    	}
    }a[N];
    
    int n;
    
    priority_queue <node> Q;
    
    int main(){
    	n=input();
    	for(int i=1;i<=n;i++){
    		a[i].x=input(),a[i].y=input();
    		a[i].id=i;
    		Q.push(a[i]);
    	}
    
    	int x=1,y=1;
    
    	while(!Q.empty()){
    		node t=Q.top();Q.pop();
    		if(x>t.x){
    			t.x=x;
    			Q.push(t);
    			continue;
    		}
    		if(y>t.y){
    			t.y=y;
    			Q.push(t);
    			continue;
    		}
    
    		printf("%d%c",t.id,Q.empty()? '
    ':' ');
    		x=max(x,t.x),y=max(t.y,y);
    	}
    }
    

    J


    往左右试探,每次倍增4倍(因为要在30m内解决问题)当走到1时分别执行一次+和-,就很简单的知道答案是什么了。


    #include <bits/stdc++.h>
    
    using namespace std;
    
    #define ll long long
    ll input(){
    	ll x=0,f=0;char ch=getchar();
    	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
    	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    	return f? -x:x;
    }
    
    int main(){
    	char c='+';
    	int len=1,check;
    	while(1){
    		for(int i=1;i<=len;i++){
    			cout<<c<<endl;
    			cin>>check;
    			if(check){
    				cout<<'+'<<endl;
    				cin>>check;
    				cout<<'-'<<endl;
    				cin>>check;
    				if(check) cout<<"! ugly"<<endl;
    				else if(c=='+') cout<<"! bad"<<endl;
    				else cout<<"! good"<<endl;
    				return 0;
    			}
    		}
    		c='+'+'-'-c;
    		len*=4;
    	}
    }
    

    I


    把"^>v<"分别设为0、1、2、3,那么操作不会改变棋盘和(mod 4)。我们可以根据L和R构造一个二分图,那么答案肯定就是二分图匹配。如果没有匹配完所有的棋盘(有剩余的位置),那么我们一定能利用这个剩余的位置来对别的位置进行操作,使得匹配都能贡献答案。这个时候答案就是匹配数。如果匹配完了所有的棋盘,我们猜想如果棋盘和(mod 4)满足条件,那么答案也是匹配数。否则我们一定要拆开一对拖鞋,答案是匹配数减去 1。

    摘自:http://clatisus.com/Petrozavodsk Winter-2019. Yandex Cup-2019#i.-slippers


    #include <bits/stdc++.h>
    
    using namespace std;
    
    #define ll long long
    ll input(){
    	ll x=0,f=0;char ch=getchar();
    	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
    	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    	return f? -x:x;
    }
    
    const int N=105;
    const int M=10005;
    
    #define pb push_back
    
    vector<int> G[M];
    int match[M],vis[M];
    int n,m,cnt;
    int id[N][N],type[N][N],mp[N][N];
    int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
    int Ans;
    
    bool dfs(int u){
    	for(auto v:G[u]){
    		if(vis[v]!=vis[0]){
    			vis[v]=vis[0];
    			if(!match[v]||dfs(match[v])){
    				match[v]=u,match[u]=v;
    				return 1;
    			}
    		}
    	}
    	return 0;
    }
    
    int main(){
    	n=input(),m=input();
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=m;j++)
    			id[i][j]=++cnt;
    
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=m;j++){
    			char s[3];
    			scanf("%s",s);
    			if(s[1]=='^') mp[i][j]=0;
    			if(s[1]=='>') mp[i][j]=1;
    			if(s[1]=='v') mp[i][j]=2;
    			if(s[1]=='<') mp[i][j]=3;
    			if(s[0]=='R') type[i][j]=1; 
    		}
    	}
    
    	for(int x=1;x<=n;x++){
    		for(int y=1;y<=m;y++){
    			if(!type[x][y]){
    				for(int k=0;k<=3;k++){
    					int tx=x+dx[k],ty=y+dy[k];
    					if(tx<1||tx>n||ty<1||ty>m||!type[tx][ty]) continue;
    					G[id[x][y]].pb(id[tx][ty]);
    					G[id[tx][ty]].pb(id[x][y]);
    				}
    				vis[0]++;
    				Ans+=dfs(id[x][y]);
    			}
    		}
    	}
    	if(Ans*2!=n*m){
    		printf("%d
    ",Ans);
    	}else{
    		int sum=0;
    		for(int i=1;i<=n;i++){
    			for(int j=1;j<=m;j++){
    				if(type[i][j]){
    					int nx=match[id[i][j]];
    					int ti=(nx-1)/m+1,tj=(nx-1)%m+1;
    					// cout<<i<<' '<<j<<' '<<ti<<' '<<tj<<endl;
    					sum+=mp[i][j],sum+=mp[ti][tj];
    					for(int k=0;k<=3;k++)
    						if(i==ti+dx[k]&&j==tj+dy[k])
    							sum-=2*(k+1);
    				}
    			}
    		}
    		// printf("%d
    ",sum);
    		if(sum%4) Ans--;
    		printf("%d
    ",Ans);
    	}
    }
    
  • 相关阅读:
    思考c++编程-译自c++ programming language 1.7节
    对于(学习c++)的c程序员的建议
    输入框字数统计效果
    去掉tppabs冗余代码
    分享JS实现IE6 PNG完全透明(包括背景图片)
    系统启动过程
    VBP结构介绍
    python的xml文件操作
    javascript实现手动调整下拉列表框
    javaScript实现从一个下拉列表到另一个下拉列表
  • 原文地址:https://www.cnblogs.com/-aether/p/12715693.html
Copyright © 2020-2023  润新知