c组第五次题解

a.反一下求 a 和 a + c 的数目乘起来就行

void solve(){
	int c;
	cin >> n >> c;
	map <int,int> mp;
	set <int> s;
	for(int i = 0; i < n; i ++)
	{
		int x;
		cin >> x;
		s.insert(x);
		mp[x] ++;
	}
	int ans = 0;
	for(auto t: s)
	{
		if(mp[t] && mp[t + c])
		{
			ans += mp[t] * mp[t + c];
		}
	}
	cout << ans << endl;
}

b.注意一下0的处理就行

void solve(){
	cin >> n;
	vector <int> a(n);
	int sum = 1;
	int sum0 = 0;
	for(int i = 0; i < n; i ++)
	{
		cin >> a[i];
		if(a[i] > 0)
		sum *= a[i];
		sum0 += (a[i] == 0);
	}
	if(sum0 >= 2)
	{
		cout << 0 << endl;
		return ;
	}
	else if(sum0 == 1)
	{
		cout << sum << endl;
		return ;
	}
	int maxn = 0;
	for(int i = 0; i < n ;i ++)
	{
		maxn = max(maxn,sum / a[i] * (a[i] + 1));
	}
	cout << maxn << endl;
}

c.无需多言

void solve(){
	string s;
	cin >> s;
	if(s == "abc" || s == "bac" || s == "acb" || s == "cba")
	cout << "YES" << endl;
	else cout << "NO" << endl; 
}

d.预处理靶子各个位置上的分数,暴力省脑子

void solve(){
	vector <vector <int>> g(11,vector <int> (11)); 
	for(int i = 1; i <= 10; i ++)
	for(int j = 1; j <= 10; j ++)
	{
		if(i >= 5 && i <= 6 && j >= 5 && j <= 6)
		{
			g[i][j] = 5;
		}
		else if(i >= 4 && i <= 7 && j >= 4 && j <= 7)
		{
			g[i][j] = 4;
		}
		else if(i >= 3 &&i <= 8 && j >= 3 && j <= 8)
		{
			g[i][j] = 3;
		}
		else if(i >= 2 && i <= 9 && j >= 2 && j <= 9)
		{
			g[i][j] = 2;
		}
		else g[i][j] = 1;
	}
	int res = 0;
	for(int i = 1; i <= 10 ; i ++)
	{
		for(int j = 1; j <= 10; j ++)
		{
			char ch;
			cin >> ch;
			if(ch == 'X') res += g[i][j];
		}
	}
	cout << res << endl;
}

e.从大到小枚举1e9 ~ 0的10的倍数,一旦m大于该数那么与其的差就是答案

void solve(){
	cin >> m;
	for(int i = 1e9; i >= 0; i /= 10)
	{
		if(m >= i)
		{
			cout << m - i << endl;
			return ;
		}
	}
}

f.众所周知x * y 等于gcd(x,y) * lcm(x,y).。 所以我们可以利用x * y 来找一对数然后判断以下他们的gcd是否为x就行。注意一下两数相等是不会有两对的情况。

void solve(){
	int x,y;
	cin >> x >> y;
	int k = y * x;
	int sum = 0;
	int sk = 0;
	for(int i = x; i <= sqrt(k); i ++)
	{
		if(k % i == 0)
		{
			int s = __gcd(i,k / i);
			if(s == x) {
				sk += (i == k / i);
				//cout << i << " " << k / i << endl;
				sum ++;
			}
		
		}
	}
	cout << sum * 2 - sk << endl;
	
}

g.神经题

void solve(){
	map <int,int> mp;
	int x;
	for(int i = 0; i < 3; i ++) cin >> x, mp[x] ++;
	for(auto [xx,yy]:mp)
	if(yy == 1) cout << xx << endl;
}

h.统计出现数量不为3的字母

void solve(){
	map <char,int> mp;
	for(int i = 0; i < 9; i ++)
	{
		char c;
		cin >> c;
		mp[c] ++;
	}
	for(auto [x,y]:mp)
	{
		if(x == '?') continue;
		if(y != 3) cout << x << endl;
	}
}

i.其实就是判断sqrt(sum)是不是整数

void solve(){
	int n;
	cin >> n;
	int sum = 0;
	int x;
	for(int i = 0; i < n; i ++) cin >> x, sum += x;
	int sq = (int) sqrt(sum);
	if(sq * sq == sum) cout << "YES" << endl;
	else cout << "NO" << endl;
}

j.反着考虑,由于只有CV和CVC,那么将字符串反转就只有VC和CVC了,这样子

只要从头开始判断遇到V就是VC,遇到C就是CVC,然后跳到下一个开头,最后反转一下就行。

​
void solve(){
	cin >> n;
	string s;
	cin >> s;
	map <char,int> mp;
	mp['a'] = mp['e'] = 1;
	mp['b'] = mp['c'] = mp['d'] = 2;
	string res = "";
    reverse(s.begin(),s.end());
    for(int i = 0;i < n; i ++)
    {
    	if(mp[s[i]] == 1)
    	{
    		res += s[i];
    		res += s[i + 1];
    		res += '.';
    		i ++;
    	}
    	else {
    		res += s[i];
    		res += s[i + 1];
    		res += s[i + 2];
    		res += '.';
    		i += 2;
    	}
    }
    res = res.substr(0,res.size() - 1);
	reverse(res.begin(),res.end());
	cout << res << endl;
}

​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值