• Solution Set -「ABC 197」


    「ABC 197A」Rotate

    Link.

    略。

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
    	char a,b,c;cin>>a>>b>>c;cout<<b<<c<<a;
    	return 0;
    }
    

    「ABC 197B」Visibility

    Link.

    扫。

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
    	int h,w,x,y;cin>>h>>w>>x>>y;vector<string> a(h);--x,--y;
    	for(string &i:a)cin>>i;
    	int ans=0;
    	for(int i=x;~i;--i)if(a[i][y]=='.')++ans;/*,printf("(%d %d)
    ",i+1,y+1);*/else break;
    	for(int i=x;i<h;++i)if(a[i][y]=='.')++ans;/*,printf("(%d %d)
    ",i+1,y+1);*/else break;
    	for(int i=y;~i;--i)if(a[x][i]=='.')++ans;/*,printf("(%d %d)
    ",x+1,i+1);*/else break;
    	for(int i=y;i<w;++i)if(a[x][i]=='.')++ans;/*,printf("(%d %d)
    ",x+1,i+1);*/else break;
    	cout<<ans-3;
    	return 0;
    }
    

    「ABC 197C」ORXOR

    Link.

    二进制枚举暴力算。

    #include<bits/stdc++.h>
    using namespace std;
    long long n,a[30],b[30];
    int main(){
    	scanf("%lld",&n);for(long long i=1;i<=n;++i){scanf("%lld",&a[i]);}
    	long long up=(1<<n),ans=1e18;
    	for(long long i=0;i<=up;++i){
    		long long ct=1;
    		b[ct]=a[1];
    		for(long long j=2;j<=n;++j)if(((i>>(j-1))&1)^((i>>(j-2))&1))b[++ct]=a[j];else b[ct]|=a[j];
    		long long tmp=0;
    		for(long long j=1;j<=ct;++j)tmp^=b[j];
    		ans=min(ans,tmp);
    	}
    	printf("%lld
    ",ans);
    	return 0;
    }
    

    「ABC 197D」Opposite

    Link.

    数学题,不会,而且读不太懂题。

    // Oops, something went wrong.
    

    「ABC 197E」Traveler

    Link.

    这个题看起来就很 关路灯

    对于每一种颜色(这里的颜色是指我们已经收集完了上一种颜色,正在收集的颜色),我们不可能走过而不拾。

    于是收完一种颜色后,我们一定是这种颜色的的最左 / 右边。

    然后就可以 DP 了;设 (f_{i,0 ext{ or }1}) 为拾 (i)-th 颜色,在左 / 右,转移显然。

    /*
    Denote f[i][0/1] for the minimum time, that we finish collecting the i-th color and we're at the left/right (0/1) endpoint.
    f[i][0]=min( f[las][0]+Dist( R[las],L[i] ),f[las][1]+Dist( L[las],L[i] ) )+R[i]-L[i];
    f[i][1]=min( f[las][0]+Dist( R[las],R[i] ),f[las][1]+Dist( L[las],R[i] ) )+R[i]-L[i];
    */
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const LL INF=1e18;
    int n;
    LL f[200010][2],L[200010],R[200010];
    int main()
    {
    	scanf("%d",&n);
    	for( int i=1;i<=n;++i )	L[i]=INF,R[i]=-INF;
    	for( int i=1;i<=n;++i )
    	{
    		LL pos;
    		int color;
    		scanf( "%lld %d",&pos,&color );
    		L[color]=min( pos,L[color] );
    		R[color]=max( pos,R[color] );
    	}
    	#define Dist( x,y ) ( LL( abs( ( x )-( y ) ) ) )
    	for( int i=1,las=0;i<=n+1;++i )
    	{
    		if( L[i]!=INF )
    		{
    			f[i][0]=min( f[las][0]+Dist( R[las],L[i] ),f[las][1]+Dist( L[las],L[i] ) )+R[i]-L[i];
    			f[i][1]=min( f[las][0]+Dist( R[las],R[i] ),f[las][1]+Dist( L[las],R[i] ) )+R[i]-L[i];
    			las=i;
    		}
    	}
    	printf( "%lld
    ",f[n+1][1] );
    	return 0;
    }
    

    「ABC 197F」Construct a Palindrome

    Link.

    相当于是从 (1)(n) 同时走,每次走字母一样的边,直接双向 BFS 即可。

    #include<bits/stdc++.h>
    using namespace std;
    #define turn(c) ((c)-'a')
    #define fs first
    #define sc second
    const int INF=1e9;
    vector<int> suf[1010][26];
    int n,m,ans=INF,vis[1010][1010];
    struct node
    {
    	int fs,sc,val;
    	node(int A=0,int B=0,int C=0){fs=A,sc=B,val=C;}
    };
    queue<node> q;
    int main()
    {
    	// freopen("in.in","r",stdin);
    	// freopen("my.out","w",stdout);
    	scanf("%d %d",&n,&m);
    	vis[1][n]=1;
    	for(int i=1;i<=m;++i)
    	{
    		int x,y;
    		scanf("%d %d",&x,&y);
    		char c=getchar();
    		while(c<'a' || c>'z')	c=getchar();
    		suf[x][turn(c)].emplace_back(y);
    		suf[y][turn(c)].emplace_back(x);
    	}
    	q.emplace(node(1,n,0));
    	while(!q.empty())
    	{
    		int one=q.front().fs,ano=q.front().sc,lav=q.front().val;
    		q.pop();
    		if(lav==ans)	return printf("%d
    ",ans<<1),0;
    		for(int i=0;i<26;++i)
    		{
    			for(int exone:suf[one][i])
    			{
    				for(int exano:suf[ano][i])
    				{
    					if(exone==ano || exano==one)	return printf("%d
    ",lav<<1|1),0;
    					if(exone==exano)	ans=lav+1;
    					if(!vis[exone][exano])
    					{
    						vis[exone][exano]=1;
    						q.emplace(node(exone,exano,lav+1));
    					}
    				}
    			}
    		}
    	}
    	printf("-1
    ");
    	return 0;
    }
    
  • 相关阅读:
    由typedef和函数指针引起的危机
    从JVM角度看Java多态
    C语言中判断字符串str1是否以str2开始或结束
    Linux下利用json-c从一个json数组中提取每一个元素中的部分字段组成一个新json数组
    C语言中的条件编译
    学会 Python 到底能干嘛?我们整理出了 7 大工作方向……
    新手指南:我应该学哪种编程语言?
    盘点:2019年最赚钱的10种编程语言
    11个提升编程能力的小方法
    收好这份 Vue 升级图,假期偷偷上个钻
  • 原文地址:https://www.cnblogs.com/orchid-any/p/14598674.html
Copyright © 2020-2023  润新知