• Codeforces Round #627 (Div. 3)


    A 俄罗斯方块游戏,已知每一列有多少方块,你可以在每一列放无数个2行1列的方块问是否可以消除所有方块。找到最大的高度,判断他减各个数的奇偶。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=100010;
    int t,n,a[N];
    int main()
    {
    	cin>>t;
    	while(t--)
    	{
    		cin>>n;
    		int res=0;
    		for(int i=0;i<n;i++)
    		{
    			cin>>a[i];
    			res=max(res,a[i]);
    		}
    		bool flag=1;
    		for(int i=0;i<n;i++)
    			if((res-a[i])&1)
    			{
    				flag=0;
    				break;
    			}
    		if(flag) cout<<"YES"<<endl;
    		else cout<<"NO"<<endl;
    	}
    	return 0;
     } 
    

    B 判断整个数组是否存在长度大于3的回文子序列,不用去找子序列,只要有相同数字之间的距离大于2就可以了,那么回文子序列就可以是这两个相同数字中间加任意一个数字了(长度3满足题意)。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=100010;
    int t,n,a[N];
    string s;
    int main()
    {
    	cin>>t;
    	while(t--)
    	{
    		cin>>n;
    		for(int i=0;i<n;i++) cin>>a[i];
    		map<int,int> mp;
    		bool flag=0;
    		for(int i=0;i<n;i++)
    		{
    			if(mp[a[i]]==0) //标记数字最左端的位置,下标从0开始,位置需要从1开始
    				mp[a[i]]=i+1;
    			else if((i+1-mp[a[i]])>1)
    			{
    				flag=1;
    				break;
    			}
    		}
    		if(flag) cout<<"YES"<<endl;
    		else cout<<"NO"<<endl;
    	}
    	
    	return 0;
     } 
    

    C 有一个小兔子想从点0跳到n+1,在点1到点n上都有一个字母L或R,当它再L 上时它必须向左跳,在R上时只能向右跳,假设一个初始距离d,每次跳的距离不能大于d,问d最小可以是多少,诈一看很像二分,就是check不好判断,假设现在兔子在点R,它向右跳如果跳到下一个R就可以继续向右跳了,要求最小的距离不是嘛,就假设它没有跳到下一个R那它一定跳到L了,它在向左跳,因为它最终一定是要到n-1的所以它还是得回到刚才的那个R,不然它不能以最小的距离到下一个R,那么它还是得跳到下一个R才能继续向右走,那么最小的那个d就是相邻R的距离的最小值,最后再处理一下n+1。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=100010;
    int t,n,a[N];
    string s;
    int main()
    {
    	cin>>t;
    	while(t--)
    	{
    		cin>>s;
    		int res=0,ans=0;
    		for(int i=0;i<s.size();i++)
    			if(s[i]=='R')
    			{
    				ans=max(i+1-res,ans);
    				res=i+1;//res标记上个R的位置
    			}
    		ans=max(ans,s.size()1-res);
    		cout<<ans<<endl;;
    	}
    	return 0;
     }
    

    补题:
    D 刚开始看错题了,看成ai-bi>aj-bj 以为是找逆序对。。。
    其实是ai-bi> bj-aj ; 就是 (ai-bi) +(aj-bj)>0 两ai=ai-bi,那么就是找 i<j时,ai+aj>0的对数,这个时候i<j 这个条件就没有用了,假设 i<j且满足ai+aj>0 ,那么将ij互换同样是满足的且只能算是一对,所以就不用考虑i<j了,只用任意两个和大于0就可以了,那么怎么高效的找呢,排序再二分就可以了。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=200010;
    int t,n,a[N],b[N];
    ll res;//注意爆int
    int q[N];
     
    int main()
    {
    	cin>>n;
    	for(int i=1;i<=n;i++) cin>>a[i];
    	for(int i=1;i<=n;i++) cin>>b[i];
    	for(int i=1;i<=n;i++) q[i]=a[i]-b[i];
    	sort(q+1,q+n+1);
    	for(int i=1;i<=n;i++)
    	{
    		int l=upper_bound(q+i+1,q+n+1,-q[i])-q;//i之前的满足的数在前面找那个数时已经被统计过了,不包括它自身,所以从q+i+1开始
    		res+=(ll) n-l+1;
    	}
    	cout<<res;
    	return 0;
     }
    

    E 已知一天有h小时,你想要睡n次觉,每一次睡一天,初始时刻是醒着的,在第i醒来后的 ai 小时或者ai-1小时之后会再次入睡,如果每次入睡的时刻在区间[l,r]之间则被称作好睡眠,问最多有多少次好睡眠。
    每次入睡可以选在ai或者ai-1时刻入睡,那么第i次可以选择的时间就是在区间[ai-i,ai] 了,每次睡觉的可能时刻就可以表示出来了,记 dp[i][j] 对应的时间就是ai-j,保存这样这时刻去睡觉最多好睡眠数量,那么这一次睡觉可以有两个选择ai(前面就减了j次)或者ai-1(前面减j-1次,这次再减1次) 对应的就是dp[i-1][j]和dp[i-1][j-])当然前提是j>0,j等0时只有一种选择ai即dp[i-1][j],如果这一时刻是好睡眠选择前面最大的再加1,不是就不用加1了,这样状态转移就找到了。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=2010;
    int t,n,h,l,r,sum[N],a[N];
    int dp[N][N];
    int main()
    {
    	cin>>n>>h>>l>>r;
    	for(int i=1;i<=n;i++) cin>>a[i],sum[i]=sum[i-1]+a[i];
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=0;j<=i;j++)
    		{
    			int x=(sum[i]-j)%h;
    			
    			if(x>=l&&x<=r)
    			{ 
    				if(!j) dp[i][j]=dp[i-1][j]+1;
    				else dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+1;
    			}
    			else if(j)dp[i][j]=max(dp[i-1][j-1],dp[i-1][j]);
    			else dp[i][j]=dp[i-1][j];
    		}
    	}
    	int ans=0;
    	for(int i=0;i<=n;i++)
    		ans=max(ans,dp[n][i]);
    	cout<<ans;
    	return 0;
     } 
    
  • 相关阅读:
    Unity物理系统随记
    Unity相机跟随小结
    unity制作赛车游戏
    动态编程
    C#-特性,反射,动态编程
    BASE64加解密
    idea快捷键
    git安装和git命令:全局设置用户名邮箱配置
    基于Node.js+MySQL开发的开源微信小程序商城(微信小程序)部署环境
    微信小程序开发入门(一),Nodejs搭建本地服务器
  • 原文地址:https://www.cnblogs.com/neflibata/p/12871779.html
Copyright © 2020-2023  润新知