Codeforces Round 917 (Div. 2)

发布时间 2024-01-04 23:34:11作者: yufan1102

A. Least Product

image
image

求乘积最小,可以改数组元素

#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

image
image
image

通过观察发现答案就是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

image
image
image
image

思路:对于本题首先要思考一个问题,就是如果我的数组通过操作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;
}