码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #627 (Div. 3) 补题

时间:2020-03-29 01:16:57      阅读:71      评论:0      收藏:0      [点我收藏+]

标签:com   起点   line   但我   summary   queue   +=   计算   卡住   

  • CF1324A Yet Another Tetris Problem

    长度为n的数组a中有一组数,可以任意使其中一项+2,问能否使a中所有项的值相同。

    感觉div.3的题目更多地在考简化问题的能力……比如原题目以俄罗斯方块作背景,让我想到的是能不能消除所有方块,导致代码很难写。但如果像上述一样简化题意,方向就很明确了:只要判断是否所有数均为偶数/均为奇数即可。

    CF1324A-代码
    #include<cstdio> 
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<set>
    #include<vector>
    #include<queue>
    using namespace std;
    
    int main()
    {
    	int a[110];
    	int kase;
    	cin>>kase;
    	while(kase--){
    		int n;
    		cin>>n;
    		a[0]=a[n+1]=0;
    		int ok=1;
    		for(int i=1;i<=n;i++){
    			cin>>a[i];
    			a[i]%2==0?a[i]=-1:a[i]=-2;//偶数记为-1,奇数记为-2 
    			if(i==1) continue;
    			if(a[i]!=a[1]) ok=0;
    		}
    		if(ok) cout<<"YES"<<endl;
    		else cout<<"NO"<<endl;
    	}
    	return 0;
    }
    
    

  • CF1324B Yet Another Palindrome Problem

    判断a串中是否存在长度3及以上的回文子串
    简化问题:是否存在长度3的回文子串
    再简化:是否存在两个不相邻的相等元素

    简化到核心部分已经直接表明代码应该怎么写了……但是具体细节还是要展开一下:

    在遍历a串的过程中,用vis数组标记遇到的数字,并记录这个数字第一次出现时的下标。如果遍历到的数字是第二次遇到(\(vis[a[i]]!=0\)), 那么与第一次遇到该数字的位置作个距离计算,只要\(>1\)就能说明不相邻,可以作为首尾构成回文子串。

    CF1324B-代码

    ?

    #include<cstdio> 
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<set>
    #include<vector>
    #include<queue>
    using namespace std;
    
    int a[5010];
    int vis[5010]; 
    int main()
    {
    	int t;
    	cin>>t;
    	while(t--){
    		memset(a,0,sizeof(a));
    		memset(vis,0,sizeof(vis));
    		int n;
    		cin>>n;
    		int ok=0;
    		for(int i=1;i<=n;i++) {
    			cin>>a[i];
    			if(!vis[a[i]]) vis[a[i]]=i;
    			else if(i-vis[a[i]]>1) ok=1;
    		}
    		if(ok) cout<<"YES"<<endl;
    		else cout<<"NO"<<endl;
    	}
    	return 0;
    }
    
    

  • CF1324C Frog Jumps

    一只青蛙跳方格,只能向左向右跳。起点只能向右跳。其它格子写有L、R,代表青蛙在此方格上后的跳跃方向。青蛙可以选择一个距离\(d\),每一次跳跃都可以跳到距离\(<=d\)的格子上,问可以跳到终点的最小的\(d\)

    逆向思考一波。显然终点只能由离它最近的R格子跳过去,但我当时的思考就到这里了,然后就卡住了……

    结合题意,对于两个间接相邻的R格子,总是可以从右边的R格子跳到左边的R格子(因为它们之间必定是连续的L),如果逆向思考,我们也只能这样跳回起点——也就是说,只要考虑路上所有间接或直接相邻的R格子的之间的距离,取其中最大值,就能保证选用的\(d\)可以从终点跳回起点。

    CF1324C-代码

    ?

    #include<cstdio> 
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<set>
    #include<vector>
    #include<queue>
    using namespace std;
    
    int main()
    {
    	int t;
    	cin>>t; 
    	while(t--){
    		string a="R";
    		string x;
    		cin>>x;
    		a+=x;
    		int last=0;
    		int m=0;
    		for(int i=0;i<a.length();i++){
    			if(a[i]==‘R‘){
    				m=max(m,i-last);
    				last=i;
    			}
    		}
    		int ans;
    		int k=a.length()-last;
    		ans=max(m,k);
    		cout<<ans<<endl;
    	}
    	return 0;
    }
    
    

Codeforces Round #627 (Div. 3) 补题

标签:com   起点   line   但我   summary   queue   +=   计算   卡住   

原文地址:https://www.cnblogs.com/streamazure/p/12590358.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!