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题暂且不会,会了再补(