CodeTON Round 6 (Div. 1 + Div. 2, Rated, Prizes!)赛后总结

A. MEXanized Array

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';
    }

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

临江浪怀柔ℳ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值