《看了受制了》第四十三天,8道题,合计269道题

2023年10月17日

Div.3 Round855 A Is it a cat?

题目大意

问是不是由mMoOeEwW,组成的字符串,且顺序一定是meow

题目理解

其实只要转为小写去重即可。
我写成屎山了

代码实现

void solve()
{

	int n;
	string s;
	cin >> n >> s;
	int flag = 0;
	for(int i = 0; i < n; i++)
	{
		if(s[i] != 'm' && s[i] != 'M' && s[i] != 'e' && s[i] != 'E' && s[i] != 'o' && s[i] != 'O' && s[i] != 'w' && s[i] != 'W')
		{
			cout << "NO" << endl;
			return;
		}
	
		if(flag == 0){
			if(s[i] != 'm' && s[i] != 'M')
			{
				cout << "NO" << endl;
				return;
			}else if(s[i] == 'M' || s[i] == 'm'){
				flag = 1;
			}
		}

		if(flag == 1){
			if(s[i] != 'm' && s[i] != 'M' && s[i] != 'e' && s[i] != 'E')
			{
				cout << "NO" << endl;
				return;
			}else if(s[i] == 'e' || s[i] == 'E')
			{
				flag = 2; 
			}
		}
			

		if(flag == 2)
		{
			if(s[i] != 'e' && s[i] != 'E' && s[i] != 'o' && s[i] != 'O')
			{
				cout << "NO" << endl;
				return;
			}else if(s[i] == 'o' || s[i] == 'O')
			{
				flag = 3; 
			}
		}
			

		if(flag == 3)
		{
			if(s[i] != 'o' && s[i] != 'O' && s[i] != 'w' && s[i] != 'W')
			{
				cout << "NO" << endl;
				return;
			}else if(s[i] == 'w' || s[i] == 'W')
			{
				flag = 4; 
			}
		}


		if(flag == 4 && s[i] != 'w' && s[i] != 'W')
			flag = 5;
	}

	if(flag == 4)
		cout << "YES" << endl;
	else
		cout << "NO" << endl;
	return;
}

Div.3 Round855 B

题目大意

问有多少对大小写字符,然后有k次机会可以把大小转小写,小写转大写。

题目理解

一开始统计各自出现的次数,然后一开始即可转换,再加上k个能组成的对数就行。

代码实现


void solve()
{

	int n, k;
	cin >> n >> k;

	string s;
	cin >> s;

	vector<int> a(28), b(28);

	for(int i = 0; i < n; i++)
		if(s[i] >= 'a' && s[i] <= 'z')
			a[s[i] - 'a' + 1]++;
		else
			b[s[i] - 'A' + 1]++;

	int res = 0, cnt = 0;
	for(int i = 1; i <= 27; i++)
	{
		res += min(a[i], b[i]);
		cnt = max(a[i], b[i]) - min(a[i], b[i]);

		if(cnt / 2 > k){
			res += k;
			k = 0;
		} else{
			res += cnt / 2;
			k -= cnt / 2;
		}
	}

	

	cout << res << endl;
	return;
}

牛客Round15 A 游游的整数切割

题目理解

原数字是偶数的话,只能分割偶数,原数字是奇数的话只能分割奇数,所以统计奇数和偶数在n-1出现的次数即可。

代码实现

void solve()
{
	string s;
	cin >> s;

	int cnt1 = 0, cnt2 = 0;
	for(int i= 0 ; i < s.size() - 1 ; i++)
		if((s[i] - '0') % 2 == 0)
			cnt1++;
		else
			cnt2++;

	if((s[s.size() - 1] - '0') % 2 == 0)
		cout << cnt1;
	else
		cout << cnt2;

	return;
}

蓝桥杯双周赛E 奇怪的线段

题目理解

代码实现

const int N = 2e6+10,mod=1e9+7;
#define int long long
typedef long long LL;
typedef pair<int, int> PII;

int n,m,k;
struct Node
{
    int s,e;
    int id,op;
}node[N];
int tr[N];
int lowbit(int x)
{
    return x & -x;
}

void add(int x, int c)  // 位置x加c
{
    for (int i = x; i <= N; i += lowbit(i)) tr[i] += c;
}

int sum(int x)  // 返回前x个数的和
{
    int res = 0;
    for (int i = x; i; i -= lowbit(i)) res += tr[i];
    return res;
}

bool cmp(const Node&n1,const Node&n2){
    if(n1.e == n2.e)
    {
        if(n1.s!=n2.s) return n1.s<n2.s;    
        return n1.op<n2.op;     // 最好先插入点
    }
    return n1.e>n2.e;   // 按照右端点排序
}
int res[N];
int d[N];
void solve(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        int l,r;
        cin>>l>>r;
        if(l>r) swap(l,r);
        d[l]++,d[r+1]--;
        node[i]={l,r,0,0}; 
    }
    for(int i=1;i<N;i++) d[i]+=d[i-1];

    for(int i=1;i<=m;i++)
    {
        int a,b;
        cin>>a>>b;
        res[i]=d[a];
        if(a>b) swap(a,b);
        node[++n]={a,b,i,1};    // a和b交换了位置,如何区分不包含b
    }
    
    sort(node+1,node+1+n,cmp);
    for(int i=1;i<=n;i++)
    {
        if(node[i].op==0)
        {
            add(node[i].s,1);   // 
        }
        else
        {
            // node id就是第几个操作,res中存的是对于第i个询问,包含a的集合数量
            res[node[i].id]-=sum(node[i].s);    // 在当前区间中有多少个包含b
        }
    }
    for(int i=1;i<=m;i++) cout<<res[i]<<"\n";
    
}

Atcoder ABC 324 A

题目大意

所有数字是否相同

代码实现


void solve()
{
	int n;
	cin >> n;
	int a, b;
	cin >> a;
	int flag = 1;
	for(int i = 2; i <= n; i++)
	{
		cin >> b;
		if(b != a)
			flag = 0;
	}

	if(flag) cout << "Yes";
	else cout << "No";
	return;
}

Atcoder ABC324 B

题目大意

一个数是否是\(2^x * 3^y\)

代码实现

void solve()
{

	ll n;
	cin >> n;


	while(n)
	{
		if(n % 2 == 0) n /= 2;
		if(n % 3 == 0) n /= 3;

		if(n % 3 != 0 && n % 2 != 0)break;
	}

	if(n == 1)cout << "Yes";
	else cout << "No";

	return;
}

Atcoder ABC324 C

题目大意

一个字符串是否可以从以下四种方式转移过来:

  1. 直接相同
  2. 只有一个不同
  3. 增添一个字符
  4. 删除一个字符

代码实现

int n;
string s;
bool check(string t)
{
	int cnt = 0;
	for(int i = 0; i < (int)s.size(); i++)
		if(s[i] != t[i])
			cnt++;
	if(cnt == 1) return true;
	return false;
}

bool is_equal(string t)	// 删除一个
{
	int flag = 0;

	for(int i = 0, j = 0; i < (int)t.size(); i++, j++)
		if(t[i] != s[j])
		{
			j++;
			flag++;
			if(t[i] != s[j]) return false;
		}

	if(flag == 1 || flag == 0)
		return true;
	return false;
}

bool is_equal2(string t) // 增加一个
{
	int flag = 0;
	for(int i = 0, j = 0; i < (int)s.size(); i++, j++)
		if(t[j] != s[i])
		{
			j++;
			flag++;
			if(t[j] != s[i]) return false;
		}

	if(flag == 1 || flag == 0) return true;
	return false;
}

void solve()
{

	
	cin >> n >> s;

	vector<int> res;
	for(int i = 1; i <= n; i++)
	{
		string t;
		cin >> t;

		// 相等
		if(s == t)
		{
			res.push_back(i);
			continue;
		}

		// 是否只有一个字母不相同
		if(s.size() == t.size() && check(t))
		{
			res.push_back(i);
			continue;
		}

		if((int)s.size() - 1 == (int)t.size() && is_equal(t))
		{
			res.push_back(i);
			continue;
		}

		if((int)s.size() + 1 == (int)t.size() && is_equal2(t))
		{
			res.push_back(i);
			continue;
		}

	}

	cout << res.size() << endl;

	for(int i = 0; i < (int)res.size(); i++)
		cout << res[i] << " ";
	return;
}

Acwing292 炮兵阵地

题目理解

4.png

代码实现


const int N = 110, M = 10, S = (1 << M) + 10;

int n, m;
int g[N];
int f[2][S][S];
vector<int> state;
int cnt[S];

bool check(int u)
{
	for(int i = 0; i < m; i++)
		if(u >> i & 1 && (((u >> (i + 1)) & 1) || ((u >> (i + 2)) & 1)))
			return false;

	return true;
}

int count(int u)
{
	int res = 0;
    for (int i = 0; i < m; i ++ )
        if (u >> i & 1)
            res ++ ;
    return res;
}

void solve()
{
	cin >> n >> m;

	// 获取初始地图
	for(int i = 0; i < n; i++)
		for(int j = 0; j < m; j++)
		{
			char c;
			cin >> c;
			if(c == 'H') g[i] += 1 << j;
		}

	// 获取合法状态
	for(int i = 0; i < (1 << m); i++)
		if(check(i))
		{
			state.push_back(i);
			cnt[i] = count(i);
		}

	for(int i = 0; i < n + 2; i++)
		for(int j = 0; j < (int)state.size(); j++)
			for(int k = 0; k < (int)state.size(); k++)
				for(int u = 0; u < (int)state.size(); u++)
				{
					int a = state[u], b = state[j], c = state[k];
					if((a & b) || (a & c) || (b & c)) continue;	// 没有交集
					if(g[i] & c) continue;	// 不放山上

					f[i & 1][j][k] = max(f[i & 1][j][k], f[(i - 1) & 1][u][j] + cnt[c]);
				}

	cout << f[(n + 1) & 1][0][0];

	return;
}
posted @ 2023-10-17 22:52  wxzcch  阅读(16)  评论(0)    收藏  举报