码风丑陋,大佬勿喷
正文
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);
}