蓝桥双周赛 19 题解

前言

在队友帮助下ak了,看吧

正文

A

直接输出

#include <iostream>
using namespace std;
int main()
{
  cout<<5000/3;// 请在此输入您的代码
  return 0;
}

B

字符串处理

#include <iostream>
using namespace std;
int main()
{
  string s;
  cin>>s;
  s+='*';
  int n=s.size()-1;
  int ans=n;
  int cnt=0;
  for(char c:s)
  {
    if(c=='L')cnt++;
    else {
      if(cnt>=1)ans-=cnt-1;cnt=0;
    }
  }
  int ans1=n;
   for(char c:s)
  {
    if(c=='Q')cnt++;
    else {
      if(cnt>=1) ans1-=cnt-1;cnt=0;
    }
  }
  cout<<min(ans,ans1);
  return 0;
}

C

非常坑B的字符串处理,就给一个样例QLQ,应该是1,看看能不能过这个吧

#include <iostream>
using namespace std;
int main()
{
  string s;
  cin>>s;
  int ans=0,f=1;
  for(int i=0;i<s.size()-1;i++)
  {
    if(s[i]=='Q'&&s[i+1]=='Q')
    {
      if(f)ans++,f=0;
    }
    else {
      if(s[i]=='L'&&s[i+1]=='Q'&&i&&s[i-1]=='Q')ans--;
      ans++;
    }
  }
  cout<<ans;
  return 0;
}

这里是题干,加一个特判就好

D

用二进制进行处理

直接模拟即可

#include <iostream>
using namespace std;
int main()
{
 int T;
 cin>>T;
 while(T--)
 {
   int n;
   cin>>n;
   int ans=1,t=2;
   n>>=1;
   while(n)
   {
     ans+=t,n>>=1;t<<=1;
   }
   cout<<ans<<endl;
 }
  return 0;
}

E

这个是运用差分数组找到最优的传送门在哪里,然后排序即可

#include <bits/stdc++.h>
using namespace std;

int main() {
	int n, k, x;
	cin >> n >> k;
	vector<int>a(n + 1), b(n + 1);
	map<int, int>mp;
	for (int i = 1; i <= n; i++) {
		cin >> x;
		mp[x] = i;
	}
	for (int i = 1; i < n; i++) {
		int l = min(mp[i], mp[i + 1]), r = max(mp[i], mp[i + 1]);
		b[l]++;
		b[r]--;
	}
	for (int i = 2; i < n; i++)
		b[i] += b[i - 1];
	sort(b.begin() + 1, b.begin() + n, greater<int>());
	int ans = 0;
	for (int i = 1; i < n; i++)
		if (k > 0)
			ans++, k -= b[i];
	if (k > 0)
		ans = -1;
	cout << ans;
	return 0;
}

F

其实只要最大值不是连续m都可以转化成完美的,一个结论题

#include <iostream>
using namespace std;
#define mod 998244353
#define int long long

int qow(int n, int k) {
	int res = 1;
	while (k) {
		if (1 & k)
			res = res * n % mod;
		n = n * n % mod;
		k >>= 1;
	}
	return res;
}
int a[1005][1005];

signed main() {
	int n, m;
	int ans = 0;
	cin >> n >> m;
	for (int i = 0; i <= 1001 ; i++)
		for (int j = 0; j <= i; j++) {
			if (j == 0)
				a[i][j] = 1;
			else
				a[i][j] = (a[i - 1][j - 1] + a[i - 1][j]) % mod;
		}
	int t = n / 2, t1;

	t1 = n - t;
	for (int i = 1; i <= t1; i++) {
		ans = (ans + qow(m - 1, n - i) * a[n - i + 1][i] % mod) % mod;
	}
	cout << ans;
	return 0;
}

后记

希望多多努力,早日自己ak

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值