ABC297 CDE 题解 - zhouzhiyuan

zhouzhiyuan 2023-07-18 18:54:38 4

码风丑陋,大佬勿喷

正文


C题

题目大意

给定一个 列的字符数组,仅包含 ‘’ 和 ‘’。 有如下操作:如果同一行相邻两个字符都是 ‘’,将前一个字符改为 ‘’,后一个字符改为 ‘’。 你需要尽可能最大化操作次数。 输出操作后的字符数组。

思路分析

直接模拟就行了,按顺序扫一遍字符数组就行。

代码部分

#include<bits/stdc++.h>
using namespace std;
int n,m;
char a[105][105];
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<m;j++){
			if(a[i][j]=='T'&&a[i][j+1]=='T'){
				a[i][j]='P',a[i][j+1]='C';
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cout<<a[i][j];
		}
		cout<<"\n";
	}
} 

D题

题目大意

给定两数 ,重复执行以下操作直至 :

  • 如果 ,将 设为
  • 如果 ,将 设为

输出操作次数。

思路分析

因为数据范围过大,所以本题使用辗转相除法解决。

注意要开

代码部分

#include<bits/stdc++.h>
#define int long long
using namespace std;
int a,b,s=0;
void gcd(int x,int y){
	if(x<y)swap(x,y);
	s+=x/y;
	if(x%y==0)return;
	else gcd(y,x%y);
}
signed main(){
	scanf("%lld%lld",&a,&b);
	gcd(a,b);
	printf("%lld",s-1);
} 

E题

题目大意

给定一个长度为 的数组 表示第 个东西的价格。 你可以购买任意的商品,这样付的钱也会不同。 找出第 小的付费价格。

思路分析

背包问题。数据范围过大,可以用 存前 个数,每次用存着的前 个数加上当前输入的数。 最后输出第 小的数。

代码部分

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k,x; 
set<int>st;
signed main(){
    scanf("%lld%lld",&n,&k);
    st.insert(0);
    for(int i=1;i<=n;i++){
		scanf("%lld",&x);
		set<int>::iterator it=st.begin();
		for(int j=1;j<=k;j++,it++)st.insert(*it+x);
	} 
	set<int>::iterator it=st.begin();
	while(k--)it++;
	printf("%lld",*it);
}
{{ vote && vote.total.up }}