A. MEXanized Array![](https://i-blog.csdnimg.cn/blog_migrate/739d801f8c15759d26c1f530527d0b95.png)
void solve(){
int n,k,x;cin>>n>>k>>x;
if(k>x+1||k>n)
cout<<-1<<endl;
else{
vector<int>ans;
int cnt=0;
for(int i=0;i<k;i++)
ans.push_back(i),cnt++;
if(k==x)x--;
for(int i=x;cnt<n;cnt++){
ans.push_back(i);
}
int sum=0;
for(int i=0;i<n;i++)
sum+=ans[i];
cout<<sum<<endl;
}
}
B. Friendly Arrays
题目描述:
分析:
这道题是位运算简单应用。首先我们需要知道如果n是偶数的话,答案会小于a数组的异或和,因为可以消去a数组1的个数,如果这一位是1,那么经过偶数次异或的话就会变为0;我们再看奇数,经过偶数次的异或,原来是1的那位变成0,再异或一次就变成1了。所以偶数个的最大值就是a数组异或起来,奇数个的最大值就是a数组位或上b数组的位或。
void solve(){
int n,m;cin>>n>>m;
vector<int>a(n),b(m);
for(int i=0;i<n;i++)
cin>>a[i];
int t=0;
for(int i=0;i<m;i++)
cin>>b[i],t|=b[i];
int ans1=0,ans2=0;
for(int i=0;i<n;i++){
ans1^=a[i];
ans2^=(a[i]|t);
}
cout<<min(ans1,ans2)<<' '<<max(ans1,ans2)<<endl;
}
C. Colorful Table
题目描述
分析:
这道题可以用贪心过。我的思路是:把每个数的下标存起来,然后开始从大到小枚举所有数,往两边扩展,你需要知道的是,小数的区域包含大数的区域。
void solve(){
int n,k;cin>>n>>k;
vector<int>ans(k+1,0);
vector<vector<int>>e(k+1);
for(int i=1;i<=n;i++){
int x;cin>>x;
e[x].push_back(i);
}
int l=0x3f3f3f3f,r=0;
for(int i=k;i>=1;i--){
if(e[i].size()==0)continue;
for(auto x:e[i]){
l=min(x,l);r=max(r,x);
}
ans[i]=(r-l+1)*2;
}
for(int i=1;i<=k;i++)
cout<<ans[i]<<' ';
cout<<endl;
}
D. Prefix Purchase
题目描述
分析
如果有一个前缀,而另一个更长的前缀价格更低,那么购买较短的前缀是没有用的。所有购买的前缀都可以替换为购买较长的前缀,答案只会更好。
solve(){
int n;
cin >> n;
vector<ll> a(n + 1);
for(int i = 1; i <= n; i ++) cin >> a[i];
for(int i = n; i >= 1; i --) {
a[i - 1] = min(a[i - 1], a[i]);
a[i] -= a[i - 1];
}
ll k;
cin >> k;
ll ans = 1e18;
for(int i = 1; i <= n; i ++) {
if(a[i]) ans = min(ans, k / a[i]);
cout << ans << ' ';
k -= ans * a[i];
}
cout << '\n';
}