专栏文章

题解:P11638 Max,Mex

P11638题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@miqddsze
此快照首次捕获于
2025/12/04 02:58
3 个月前
此快照最后确认于
2025/12/04 02:58
3 个月前
查看原文
如果两个操作数 x,yx,y 进行操作,那么只有 x=0x=0 或是 y=0y=0 时才能让这两个数的和增加。但是,我们不仅可以把 00 变成其他数,还能把其他数(比如 11)变为 00!把所有的 11 变为 00,然后和其他数配对,就是最优解。
所以,最终答案就是(假设一共有 orzorz0011,去除了序列中的 0011 之后序列的和为 ansans): ans+2×orz1ans+2\times orz-1
这个式子中的 1-1 是因为第一个变换后的 00(原先序列中的 0011)只能变为 11,而其他变换后的 00(原先序列中的 0011)能够变为 22
但是,这里有个坑点(hack 数据):如果 n=1n=1,那么最终的答案只能是序列的和,而不是上面那个式子。
代码:
CPP
#include<bits/stdc++.h>
#define int long long
#define INF 0x3f3f3f
using namespace std;
int n,x,ans,orz;
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>x;
		if(x==0||x==1)orz++;
		else ans+=x;
	}
	if(n!=1&&orz!=0)cout<<ans+2*orz-1;
	else cout<<ans;
	return 0;
}

评论

1 条评论,欢迎与作者交流。

正在加载评论...