• Codeforces Round #656 (Div. 3)(A-E)


    A. Three Pairwise Maximums
    题意:给出x,y,z,其中x=max(a,b),y=max(a,c),z=max(b,c),能否求出a,b,c.
    题解:发现若a,b,c存在,则有x<y=z的大小关系,a,b,c中的最大值和次大值就知道了。

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    
    int T;
    
    
    int main()
    {
    	cin>>T;
    	while(T--)
    	{
    		int a[4];
    		cin>>a[1]>>a[2]>>a[3];
    		sort(a+1,a+3+1);
    		if(a[3]!=a[2])
    		{
    			cout<<"NO
    ";
    			continue;
    		}	
    		cout<<"YES
    "; 
    		cout<<a[3]<<" "<<a[1]<<" "<<"1
    ";
    	}
    	return 0;
    } 
    

    B. Restore the Permutation by Merger
    拿个桶判断 没出现输出就行

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    int T,n;
    
    int vis[55];
    
    int main()
    {
    	cin>>T;
    	while(T--)
    	{
    		cin>>n;
    		n=n*2;
    		int x;
    		memset(vis,0,sizeof(vis));
    		for(int i=1;i<=n;i++) 
    		{
    			cin>>x;
    			if(!vis[x])
    			{
    				cout<<x<<" ";
    				vis[x]=true;
    			}
    		}
    		cout<<endl;
    	}
    	return 0;
    } 
    

    C. Make It Good
    题意:删除字符串a最小前缀,满足被删前缀后的字符串a,每次从头或尾取字符组成的字符串c不减。
    题解:若c不减,则a必须是先递增再递减的形式,即是单峰。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define N 200009
    using namespace std;
    
    int T;
    
    int n;
    int a[N];
    
    int main()
    {
    	cin>>T;
    	while(T--)
    	{
    		cin>>n;
    		for(int i=1;i<=n;i++) cin>>a[i];
    		int now=n;
    		for(int i=n;i>=1;i--) 
    		{
    			if(a[i]<=a[i-1]) now--;
    			else break; 
    		}
    		int tmp=now;
    		for(int i=tmp;i>=1;i--)
    		{
    			if(a[i]>=a[i-1]) now--;
    			else break;
    		}
    		if(now)now--;
    		cout<<now<<endl;
    	}
    	return 0;
    } 
    

    D. a-Good String
    最少修改多少次,让字符串变为a-good string
    .

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define N 131077
    using namespace std;
    
    int T;
    
    int n,len,ans;
    
    char s[N];
    
    int a[30][N];
    
    //12345678
    
    void slove(int l,int r,int tp,int now)
    {
    	if(l==r)
    	{
    		if(s[l]-'a'+1!=tp) now++;
    		ans=min(ans,now);
    		return ; 
    	} 
    	int mid=(l+r)>>1;
    	slove(mid+1,r,tp+1,now+(mid-l+1)-(a[tp][mid]-a[tp][l-1]));
    	slove(l,mid,tp+1,now+(r-mid)-(a[tp][r]-a[tp][mid])); 
    }
    
    int main()
    {
    	cin>>T;
    	while(T--)
    	{
    		cin>>n;
    		scanf("%s",s+1);
    		len=strlen(s+1);ans=len;
    		for(int i=1;i<=len;i++)
    		{
    			for(int j=1;j<=26;j++)
    			{
    				a[j][i]=a[j][i-1];
    			}
    			a[s[i]-'a'+1][i]++; 
    		}	
    		slove(1,len,1,0);
    		cout<<ans<<endl;
    	}
    	return 0;
    }
    

    E. Directing Edges.
    题目大意:给你一张图,只有部分边确定方向,有的边没有确定方向,有没有一种确定方向的方法,让这张图为有向无环图。

    题解:先在有向边的基础上跑拓扑排序,无向边使拓扑序小的指向拓扑序大的。

    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<cstring>
    #include<algorithm>
    #define N 200009 
    using namespace std;
    queue<int>q;
    
    int T,js;
    bool flag;
    int n,m;
    int sumedge;
    
    int head[N],xx[N],yy[N],vis[N],col[N],In_du[N],dep[N];
    
    struct Edge
    {
    	int x,y,nxt;
    	Edge(int x=0,int y=0,int nxt=0):
    	x(x),y(y),nxt(nxt){} 
    }edge[N];
    
    void add(int x,int y)
    {
    	edge[++sumedge]=Edge(x,y,head[x]);
    	head[x]=sumedge;
    }
    
    void Clear_Init()
    {
    	memset(In_du,0,sizeof(In_du));
    	memset(head,0,sizeof(head));
    	while(!q.empty()) q.pop();
    	sumedge=0;flag=true;js=0;
    	cin>>n>>m;
    	for(int i=1;i<=m;i++)
    	{
    		int p,x,y;
    		cin>>p>>x>>y;
    		if(p==1)
    		{
    			add(x,y);
    			In_du[y]++;
    		}
    		xx[i]=x,yy[i]=y;
    	}
    }
    
    bool DFS(int x)
    {
    	vis[x]=true;
    	col[x]=0;
    	for(int i=head[x];i;i=edge[i].nxt)
    	{
    		int v=edge[i].y;
    		if(col[v]==0) return false;
    		else if(col[v]==-1&&!DFS(v)) return false;
    	}
    	col[x]=1;
    	return true;
    }
    
    void pre_slove()
    {
    	for(int i=1;i<=n;i++)
    	{
    		if(!vis[i]&&!DFS(i))
    		{
    			cout<<"NO
    ";
    			flag=false;
    			return ;
    		}
    	}
    }
    
    void Top_sort()
    {
    	for(int i=1;i<=n;i++)
    	{
    		if(!In_du[i]) q.push(i); 
    	}
    	while(!q.empty())
    	{
    		int now=q.front();q.pop();
    		dep[now]=++js; 
    		for(int i=head[now];i;i=edge[i].nxt)
    		{
    			int v=edge[i].y;
    			In_du[v]--;
    			if(!In_du[v]) q.push(v); 
    		}
    	}
    }
    
    void Put()
    {
    	cout<<"YES
    ";
    	for(int i=1;i<=m;i++)
    	{
    		int x=xx[i],y=yy[i];
    		if(dep[x]<dep[y]) cout<<x<<" "<<y<<endl;
    		else cout<<y<<" "<<x<<endl;
    	}
    }
    
    int main()
    {
    	cin>>T;
    	while(T--)
    	{
    		Clear_Init();
    		//pre_slove();
    		//if(!flag) continue;
    		Top_sort();
    		if(js<n) cout<<"NO
    ";
    		else Put();
    	}
    	return 0;
    }
    
  • 相关阅读:
    log4net
    配置文件序列化到文件中
    log日志
    Quartz任务管理
    tuple
    mvc视图中使用JavaScriptSerializer
    windows服务安装
    23种设计模式之普通工厂模式代码实例
    23种设计模式之单例模式代码实例
    putty文件传输
  • 原文地址:https://www.cnblogs.com/zzyh/p/15230763.html
Copyright © 2020-2023  润新知