Codeforces Round 957 (Div. 3)(A~E题解)

这次比赛只能用抽象来形容,前五道题都没有什么算法,都是思维加模拟都能过,然后第四题卡住了,第五题不知道为什么做出来的人那么少,就是纯暴力就能过,但是没抓住上分的机会,有些可惜,但是还好打完比赛把第四个重新补出来了,感觉大模拟的题还是不太擅长,以后可以练习一下

话不多说,直接看题

A. Only Pluses

 题意:就是给你三个数,三个数一共可以增加的次数为5,问你增加完之后,其三个数的乘积最大值为多少

思路:思路就是小学数学题,但是因为实现有问题,也是卡了我20分钟,我就知道这次比赛直接白搭

每次选取出来三个数里面最小的一个加上1就可以

#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int a,b,c;

int solve(int a,int b,int c)
{
	return min(min(b,c),a);
}

signed main()
{
	cin>>t;
	while(t--)
	{
		cin>>a>>b>>c;
		for(int i=1;i<=5;i++)
		{
			int flag=solve(a,b,c);
			if(a==flag)
			{
				a++;
				continue;
			}
			else if(b==flag)
			{
				b++;
				continue;
			}
			else if(c==flag)
			{
				c++;
				continue;
			}
		}
		cout<<a*b*c<<"\n";
	}
	return 0;
}

B. Angry Monk

 题意:就是说每次操作只能将一块蛋糕分成1和w-1或者将一个重量为w,另一个重量为1的拼起来

思路:很明显就能想到,除了最大的一块外,别的都是分割操作w-1次,拼接操作w次,因此就可以直接写出来了

#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n,k;
int a[100005];
signed main()
{
	cin>>t;
	while(t--)
	{
		int maxn=0;
        int flag=0;
		cin>>n>>k;
		int ans=0;
		for(int i=1;i<=k;i++)
		{
			cin>>a[i];
			if(a[i]>maxn)
			{
				maxn=a[i];
				flag=i;
			}
		}
		for(int i=1;i<=k;i++)
		{
			if(i==flag)
			continue;
			ans+=a[i]*2-1;
		}
		cout<<ans<<"\n";
	}
	return 0;
}

C. Gorilla and Permutation

题意:给你一个n,m,k,然后f函数里面是前i个数里面不小于k的值的和,因此前面就从大到小倒着来就可以,然后当轮到倒数第m个后,要从前往后来,确保前面的数更小,累加值更大

#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n,m,k;
int a[100005];
signed main()
{
	cin>>t;
	while(t--)
	{
		cin>>n>>m>>k;
	for(int i=n;i>=m+1;i--)
	{
		a[i]=i;
	}
	for(int i=1;i<=m;i++)
	{
		a[i]=m-i+1;
	}
	for(int i=n;i>=1;i--)
	{
		cout<<a[i]<<" ";
	}
	cout<<"\n";
	}
	return 0;
}

D. Test of Love

 纯模拟的题,一开始忘了区分当前位置在水里还是在木头上,错了好几次,后面打完比赛也是想到这个问题了,后面才改对的

pair<int,int> old,第一个数存的是当前位置的下标,第二个存的是当前在水里还是在木头上

如果木头上,我们需要判断下一个木头距离当前位置的的距离,如果小于m则直接更新old的first即可,然后如果大于m,则需要判断当前位置+m后在哪里,如果是鳄鱼,那么肯定是no

如果是水,判断水和下一个木头的位置,如果中间存在鳄鱼,那么也是不可能的,如果没有鳄鱼,则需要判断如果游泳,会不会超过k,如果总游泳没有超过k,则可以,更新old的first和second即可

#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n,m,k;
char s[200005];
int sum=0;
int ans=0;

void solve()
{
	sum=0;//在水中游的距离 
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++)
    {
    	cin>>s[i];
	}
	if(m>n)
	{
		cout<<"YES\n";
		return;
	}
	s[n+1]='L';
	pair<int,int> old;
	old.first=0;
	old.second=0;
	for(int i=1;i<=n+1;i++)
	{
		if(s[i]=='L'&&old.second==0)//现在位置在陆地上 
		{
			if(i-old.first<=m)
			{
				old.first=i;
				old.second=0;
				continue;
			}
			else
			{
				if(s[old.first+m]=='C')
				{
					cout<<"NO\n";
					return ;
				}
				else
				{
					old.first+=m;
					old.second=1;
					i--;
				}
			}
		}
		if(s[i]=='L'&&old.second==1)
		{
			for(int j=old.first;j<i;j++)
			{
				if(s[j]=='C')
				{
					cout<<"NO\n";
					return;
				}
				sum++;
				if(sum>k)
				{
					cout<<"NO\n";
					return ;
				}
			}
			old.first=i;
			old.second=0;
		}
	}
	cout<<"YES\n";
	return ;
}


signed main()
{
    cin>>t;
    while(t--)
    {
    	solve();
    }
    return 0;
}

E. Novice's Mistake

题意:就是说你一个字符串乘以一个数等于a个n链接在一起,减去一个数,就相当于减去一部分,如果减的太多了,那字符串没了,直接就是0

思路:这题数据很小纯暴力就能过,a的最大值才1e5,b的值由a决定

首先可以说明,对于100这个数据,无论你选什么数,你都无法正确得出结果,因此为0个解,直接输出0即可(可以按照下面的思路写,我是自己测试完优化代码的)

对于别的数,再分是否小于10,和大于10就行(太困了,明天再补全)

(好了开始补了),当a小于10的时候,a*n-b的最大也才在1e5这个级别,也就是说,a和b的差值最大为4,因此我们b的范围为max(1,a-4)~a-1

然后当a>10的时候a*n-b最大在1e6这个级别,所以a和b的差值最大为5,然后因此我们b的范围为max(1,a-5)~a-1

有了范围直接模拟就行,模拟直接过

#include <bits/stdc++.h>
using namespace std;
#define int long long
int t; 
int n; 

int jie() 
{
    cin>>n; 
    if(n == 100) 
    return 3;
    vector<pair<int, int>> ans;
    if(n<10) 
	{
        for(int a = 1; a <= 10000; a++) 
		{
            for(int b = max(1LL, a - 4); b < a; b++) 
			{
                int res = n * a - b;
                bool flag = true;
                for(int i = 1; i <= a - b; i++) 
				{
                    if(res % 10 != n) flag = false;
                    res /= 10;
                }
                if(res) 
				flag = false;
                if(flag) 
				ans.emplace_back(a, b);
            }
        }
    } 
	else 
	{
        for(int a = 1; a <= 10000; a++) 
		{
            for(int b = max(1LL, 2*a-5); b < 2*a; b++) 
			{
                int res = n * a - b;
                bool flag = true;
                for(int i = 1; i <= a + a - b; i++) 
				{
                    if((i + b) & 1) 
					{
                        if(res % 10 != n % 10) 
						flag = false;
                    } else 
					{
                        if(res % 10 != n / 10) 
						flag = false;
                    }
                    res /= 10;
                }
                if(res!=0) 
				flag = false;
                if(flag) 
				ans.emplace_back(a, b);
            }
        }
    }
    cout<<ans.size()<<"\n";
    for(int i = 0; i<ans.size();i++)
    {
    	cout<<ans[i].first<<" "<<ans[i].second<<'\n';
	}
	return 0;
}

signed main() {
    cin>>t;
    while(t--) 
    {
    	int d=jie();
    	if(d==3)
    	{
    		cout<<"0\n";
		}
	}
    return 0;
}

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Codeforces Round 894 (Div. 3) 是一个Codeforces举办的比赛,是第894轮的Div. 3级别比赛。它包含了一系列题目,其中包括题目E. Kolya and Movie Theatre。 根据题目描述,E. Kolya and Movie Theatre问题要求我们给定两个字符串,通过三种操作来让字符串a等于字符串b。这三种操作分别为:交换a中相同位置的字符、交换a中对称位置的字符、交换b中对称位置的字符。我们需要先进行一次预处理,替换a中的字符,然后进行上述三种操作,最终得到a等于b的结果。我们需要计算预处理操作的次数。 根据引用的讨论,当且仅当b[i]==b[n-i-1]时,如果a[i]!=a[n-i-1],需要进行一次操作;否则不需要操作。所以我们可以遍历字符串b的前半部分,判断对应位置的字符是否与后半部分对称,并统计需要进行操作的次数。 以上就是Codeforces Round 894 (Div. 3)的简要说明和题目E. Kolya and Movie Theatre的要求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Codeforces Round #498 (Div. 3) (A+B+C+D+E+F)](https://blog.csdn.net/qq_46030630/article/details/108804114)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Codeforces Round 894 (Div. 3)A~E题解](https://blog.csdn.net/gyeolhada/article/details/132491891)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值