Codeforces Round 917 (Div. 2)
A. Least Product
求乘积最小,可以改数组元素
#include<bits/stdc++.h>
#define int long long
using namespace std;
void solve(){
int n;
cin>>n;
int ans=1;
for(int i=1;i<=n;i++){
int x;
cin>>x;
if(x>0)x=1;
if(x<0)x=-1;
ans*=x;
}
if(ans<=0){
cout<<0<<"\n";
}else{
cout<<1<<"\n";
cout<<1<<" "<<0<<"\n";
}
}
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t=1;
cin>>t;
for(int i=1;i<=t;i++)solve();
return 0;
}
B. Erase First or Second Letter
通过观察发现答案就是n-每个字母第一次出现的位置
#include<bits/stdc++.h>
using namespace std;
void solve(){
int n;
string s;
cin>>n>>s;
map<char,int>mp;
int ans=0;
for(int i=0;i<n;i++){
if(mp[s[i]])continue;
mp[s[i]]=1;
ans+=(n-i);
}
cout<<ans<<"\n";
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t=1;
cin>>t;
for(int i=1;i<=t;i++)solve();
return 0;
}
C. Watering an Array
思路:对于本题首先要思考一个问题,就是如果我的数组通过操作2归0后,那么通过操作1一定会使数组变成单调递减,单调递减就意味着,最多只有位置是a[i]=i,那么我们就可以贪心的操作1一次然后操作2一次,这样是答案最大化的,现在只需要考虑的是该将原数组操作一多少次收,枚举即可//
但是问题又来了,d给的很大,最多有1e9,如果里面再循环数组找最大收获值,那么肯定会超时间,所以肯定不是那么干的,想一想。操作1,2两次能获得1的价值,一个数组理论上最多一次能获得n的价值,那么我如果第一步直接用操作2,再操作2n次贡献也是n,所以操作数不可能再比2n要多。
#include<bits/stdc++.h>
using namespace std;
void solve(){
int n,m,d;
cin>>n>>m>>d;
vector<int>a(n),v(m);
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<m;i++) cin>>v[i];
int ans=0;
//枚举执行操作1的次数
for(int i=0;i<=2*n&&i<d;i++){
int cnt=0;
for(int j=0;j<n;j++){
if(a[j]==j+1) cnt++;
}
ans=max(ans,(d-1-i)/2+cnt);
int r=v[i%m];
for(int j=0;j<r;j++) a[j]++;
}
cout<<ans<<'\n';
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t=1;
cin>>t;
for(int i=1;i<=t;i++)solve();
return 0;
}