[cf] Codeforces Round #753 (Div. 3) 无语场..

前言

尽量每场都想讲,让cf不怎么玄学
传送门 :

A. Linear Keyboard

给你下标,让你映射,然后输出 ∑ i = 2 n h a s h [ i ] − h a s h [ i − 1 ] \sum _{i=2}^{n} hash[i]-hash[i-1] i=2nhash[i]hash[i1]

反思 :
其实当我写完 A题的时候, 已经过了4000多人了,这实在是慢很多

虽然看题是一方面,但是其实 是我多考虑了 那个数组下标 为负数的情况

其实是不会出现的

CODE
void solve()
{
	string s;cin>>s;
	int len = s.size();
	for(int i= 0 ;i<len;i++)
	a[s[i]-'a'] = i ;
	
	int sum = 0 ;
	cin>>s;
	len = s.size();
	for(int i =1 ;i<len;i++)
	{
		sum+=abs(a[s[i]-'a'] - a[s[i-1]-'a']);
	}
	cout<<sum<<endl;
}

B. Odd Grasshopper

每四个 就会回到起点,根据这个性质,枚举增量
(数学证明不怎么会)

CODE
void solve()
{
   int x,n;
   cin>>x>>n;
   
   int now = 1;
   now = n/4 * 4 +1;
   
   while(now > n )
   now -=4;
   
   while(now <= n)
   {
   		if(x&1)
   		x+=now;
   		else
   		x-=now;
   		
   		now++;
   }
   cout<<x<<endl;
}

C.Minimum Extraction

感觉C比B简单很多

既然每次都是最小的,那么我们排一个序

然后再累加最小值当作总增量,然后在计算答案即可

但是呢,因为增量都是一样的,所以我们可以直接计算他们之间的差值

CODE
void solve()
{
	cin>>n;
	if(n == 1)
	{
		int x;cin>>x;
		cout<<x<<endl;
		return;
	}
	for(int i=1;i<=n;i++)
	cin>>c[i];
	sort(c+1,c+1+n);
	int ans = c[1] ;
	for(int i=2;i<=n;i++)
	ans = max(ans,c[i]-c[i-1]);
	cout<<ans<<endl;
}

D.Blue-Red Permutation

分红色和蓝色处理

如果蓝色中出现了,当前小于他小标的数,我们就无法通过操作让他变回去,因为只能变成比他小的数

红色反之同理

CODE
void solve()
{
	int n;cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>num[i].l;
	}
	string s;
	cin>>s;
	for(int i=0;i<n;i++)
	{
		num[i+1].r = (int)s[i];
	}

	sort(num+1,num+1+n);
	int f = 1;
	for(int i=1;i<=n;i++)
	{
		if(num[i].r =='B' && num[i].l <i)
		{
			f = 0;
			break;
		}
		
		if(num[i].r =='R' && num[i].l >i){
			f = 0;
			break;
		}
	}
	if(f)
	cout<<"YES"<<endl;
	else
	cout<<"NO"<<endl;
}

E. Robot on the Board 1

题目看错了,想歪了,如果走掉了那么就走掉了QAQ

对于这题,我们只需要每次能走的最大上下限,和左右限

然后再增加 变量即可

感觉后面几题 都比 B B B 简单 QAQ

CODE
void solve()
{
	int r,c;cin>>r>>c;
	string s;cin>>s;
	
	int mn = 0 ,cur = 0 ;
	int mx = 0 ;
	
	for(auto x : s)
	{
		if(mx -mn +1 == r)
		break;
		if(x == 'U')
		cur--;
		
		if(x == 'D')
		cur++;
		
		mn = min(mn,cur);
		mx = max(mx,cur);
	}
	
	cout<<1-mn<<" ";
	mn = 0 ,mx  = 0  ,cur = 0;
	for(auto x : s)
	{
		if(mx -mn+1 == c)
		break;
		
		if(x == 'L') 
		cur--;
		if(x == 'R')
		cur++;
		mn = min(mn,cur);
		mx = max(mx,cur);
	}
	cout<<1-mn<<endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值