Codeforces 917(Div2)A-B

A

第一题其实很好考虑,因为要最小值,所以如果乘积是正数直接随便改一个变成0就行,但是什么情况下他们的乘积是正数呢,我们考虑负数的数量是偶数的情况(此时包括了负数数量=0的情况),如果乘积是偶数,那么我们直接输出1 0就好,但是如果  1.乘积是负数(即负数的数量为奇数)或者 2.原数组中有0,我们直接输出0就行.

#include<bits/stdc++.h>
using namespace std;
void solve()
{
	int n; cin >> n;
	vector<int>v(n);
	for (int i = 0; i <= n - 1; ++i)cin >> v[i];
	int flag = 0;//用来判断原数组中是否有0
	int fu = 0;//记录负数的数量
	for (auto i : v)
	{
		if (i == 0)flag = 1;
		if (i < 0)fu++;
	}
	if (flag == 1)
	{
		cout << 0 << '\n';
		return;
	}
	else
	{
		if (fu % 2 == 0)
		{   cout<<1<<'\n';
			cout << 1 << ' ' << 0 << '\n';
			return;
		}
		else
		{
			cout << 0 << '\n';
		}
	}
}
int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int _; cin >> _;
	while (_--)solve();
}

B

B题我们可以发现,无论字符串是什么,我们进行几次操作,长度不同的字符串都是不一样的字符串,所以我们可以提前把答案定成n(字符串的长度),然后我们考虑删除1,2,3....,n-1个字符,此时我们可以发现,如果删除一个字符,那么我们从3~n的字符串都是不会变的,就考虑前面的元素有几种字母,我们答案+=字母类型就好了,因为要考虑种类,我们可以直接开个set来计数(不会有重复元素)

这里可以自己拿几组例子来模拟一下

#include<bits/stdc++.h>
using namespace std;
void solve()
{
	int n; cin >> n;
	string s; cin >> s;
	int ans = n;
	set<int>a;//记录有几种不同的字母
	for (int i = 0; i <= n - 1; ++i)
	{
		a.insert(s[i] - 'a');
		ans += a.size() - 1;//答案加上字母种类减一就好
	}
	cout << ans << '\n';
}
int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int _; cin >> _;
	while (_--)solve();
}

从别人那里偷的第二种做法)

这里就是可以不用提前计算ans=n;这个过程会被统一在循环中进行

#include<bits/stdc++.h>
using namespace std;
 
#define endl '\n'
#define ll long long
 
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        string s;
        cin>>s;
        map<int,int>da;
        long long ans=0;
        for(int i=0;i<=n-1;i++){
            da[s[i]-'a']=1;
            for(int j=0;j<=25;j++){
                ans+=da[j];
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

C题暂且不会,会了再补(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值