Codeforces Round #784(div 4)

总结:div4相对比较简单,以至于能ak。


A. Division?

题目大意:对应分数输出等级

简单模拟

#include<iostream>
using namespace std;
 
int main()
{
	int t;
	cin>>t;
	
	while(t--)
	{
		int x;
		cin>>x;
		if(x <= 1399) puts("Division 4");
		else if(x <= 1599) puts("Division 3");
		else if(x <= 1899) puts("Division 2");
		else  puts("Division 1");
	 } 
	return 0;
 } 

B. Triple

题目大意:找出在数组中出现次数超过3的数。

可以用vector简化,注意多组测试样例,不要在数据没输入完毕时break。

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


int main() {
	int t; cin >> t;
	while(t--) {
	    int n; cin >> n;
    	vector<int> cnt(n + 1, 0);
    	int ans = -1;
    	for(int i = 0; i < n; i++) {
    		int x; cin >> x;
    		if(++cnt[x] >= 3) {
    			ans = x;
    		}
    	}
    	cout << ans << endl;
	}
}

C.Odd/Even Increments

题目大意:可以对奇数位或者偶数位同时加1,判断是否能让数组所有元素具有相同的奇偶性。

所有奇数位和偶数位对应的奇偶性必须相同,这样才能达到全部改掉的效果。

注意逻辑与和按位与的区别!!

// 按位与: a&b,a和b转化成二进制再进行与运算
// 逻辑与: a && b,当a、b均为true时,其结果才为true。 

#include<iostream>
using namespace std;


const int N = 60;
int q[N];

int main()
{
	int T;
	cin>>T;
	
	while(T--)
	{
		int od[2] = {0,0};
		int ev[2] = {0,0};
		
		int n;
		cin>>n;
		for(int i = 1;i <= n;i++)
		{
			cin>>q[i];
			if(i&1)
			{
				if(q[i]&1) od[0]++;
				else od[1]++;
			}else 
			{
				if(q[i] & 1) ev[0]++;
				else ev[1]++;
			}
		}
		
		if((od[0] && od[1]) || (ev[0] && ev[1])) puts("NO");
		else puts("YES"); 
	} 
	return 0;
} 

D. Colorful Stamp

题目大意:给一行字符串,在上面染色,每相邻位置填BR或者RB,判断给定字符串是否合法

we must have placed RB, so it should have both the characters R and B.(即不能有一段R 或者 B)

#include<iostream>
using namespace std;

int n,t;
string s;

int main()
{
	cin>>t; 
	
	while(t--)
	{
		cin>>n>>s;
		bool flag = true;
	
		for(int i = 0;i < s.size();i++)
		{
			if(s[i] != 'W') 
			{
				int j = i;
				while(s[j] == s[i] && j < s.size()) j++;
				if((j == s.size() || s[j] == 'W') && (i == 0 || s[i-1] == 'W'))
				{
					flag = false;
					break;	
				}	
				i = max(i,j-1);		
			}
		}
		if(flag)puts("YES");
		else puts("NO");
	}
} 

E. 2-Letter Strings *

题目大意:给定n个字符串,求其中只有一位相同的字符串的对数

统计第一位字母出现的次数cnt1,第二位出现的次数cnt2,再减去当前字符串s(两个字母都出现的次数)sum * 2,得到anss=cnt1+cnt22sum

#include<iostream>
#include<unordered_map>
using namespace std;

typedef long long LL;
unordered_map<char,int> mp1,mp2;
unordered_map<string,int> mp;
int n;

void solve()
{
	LL res = 0;
	mp1.clear();
	mp2.clear();
	mp.clear();
	
	cin>>n;
	for(int i = 0;i < n;i++)
	{
		string s;
		cin>>s;
		res = res + mp1[s[0]] + mp2[s[1]] - 2 * mp[s];
		mp1[s[0]]++;
		mp2[s[1]]++;
		mp[s]++; 
	}
	cout<<res<<endl;
}
int main()
{
	int t;
	cin>>t;
	while(t--) solve();
	return 0; 
 } 

F. Eating Candies

题目大意:两人分别从数组两端向中间走(吃蛋糕),求两端路径总和的最长长度(吃的蛋糕最多)。

手里少的先吃(双指针)

//手里少的先吃 
#include<iostream>
using namespace std;

const int N = 2e5 + 10;
int q[N];

int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n;
		cin>>n;
		for(int i = 0;i < n;i++) cin>>q[i];
		
		int lsum = 0,rsum = 0;
		int l = -1,r = n;
		
		int res = 0;
		while(l < r)
		{
			if(lsum <= rsum) 
			{
				
				l++;
				if(l == r) break;
				lsum += q[l];
				if(lsum == rsum) res = max(res,l +1 + n - r);

			}
			else 
			{
				r--;
				if(l == r) break;
				rsum += q[r];
				if(lsum == rsum) res = max(res,l+1+n-r);
			}
		}
		cout<<res<<endl;
	}
	return 0;
} 

G. Fall Down

题目大意:模拟石头下落的过程。

从下往上面模拟

#include<iostream>
using namespace std;


const int N = 60;
char g[N][N];
int n,m;

void solve()
{
	cin>>n>>m;
	for(int i = 0;i < n;i++) cin>>g[i];	
	
	for(int i = n-1;i >= 0;i--)
	{
		for(int j = 0;j < m;j++)
		{
			if(g[i][j] == '*')
			{
				int h = i;
				while(g[h+1][j] == '.' && g[h+1][j] != 'o' && h + 1 < n) h++;
				swap(g[i][j],g[h][j]);
			}
		}
	}
	for(int i = 0;i < n;i++)
	{
		for(int j = 0;j < m;j++) cout<<g[i][j];
		puts("");
	}
}
int main()
{
	int t;
	cin>>t;
	while(t--)	solve();
	return 0;
} 

H. Maximal AND

题目大意:给定一个数组,可以改变数组中的任何一个元素最多k次(任意位变成1),求数组所有元素按位与的最大值。

想要最大值,可以优先把高位变成1,如果k大于等于当前位0的个数,那么可以将该位变成1,反之跳到更低位。

#include<iostream>
#include<vector>
using namespace std;

int n,k;
void solve()
{
	cin>>n>>k;
	vector<int> cnt(31,0),a(n);
	for(int i = 0;i < n;i++) 
	{
		cin>>a[i];
		for(int j = 30;j >= 0;--j)
			if(a[i] & (1 << j))
				cnt[j]++;
	}
	
	int ans = 0;
	for(int i = 30;i >= 0;i--)
	{
		int need = n - cnt[i];
		if(need <= k)
		{
			k -= need;
			ans += (1 << i);
		}
	}
	cout<<ans<<endl;
}
int main()
{
	int t;cin>>t;
	while(t--) solve();
	return 0;
}

posted @   Weitongjie  阅读(196)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· Apache Tomcat RCE漏洞复现(CVE-2025-24813)
点击右上角即可分享
微信分享提示