Codeforces Round #507(Div.2)

这场真残暴。。C只有不到100人通过,当时卡b之后想着要不先看看c吧,然后一看通过人数,10+,立马回来乖乖苟b......

A

从头到尾判断一下就好,看是否有冲突,把可以确定的2填上,再扫一遍没有填上的2,0和1哪个代价小填哪个

坑点:判断冲突的时候不能只遍历到n/2!!!emmm,好像死在这两次了

  
#include <bits/stdc++.h>
using namespace std;

int main(){
	bool flag = true;
	int aa[25];
	int n, a, b;
	int ans = 0;
	cin >> n >> a >> b;
	for(int i = 0; i < n; i ++)
		cin >> aa[i];
	for(int i = 0; i < n; i ++){
		if(aa[i] == 1){
			if(aa[n - i - 1] == 0)	
				flag = false;
			if(aa[n - i - 1] == 2)
				ans += b, aa[n - i - 1] = 1;
		}
		if(aa[i] == 0){
			if(aa[n - i - 1] == 1)	
				flag = false;
			if(aa[n - i - 1] == 2)
				ans += a, aa[n - i - 1] = 0;
		}
	}
	int minx = min(a, b);
	if(! flag)
		cout << -1 << endl;
	else{
		for(int i = 0; i < n; i ++)
			if(aa[i] == 2)
				ans += minx;
		cout << ans << endl;
	}
	return 0;
}

B

推一下就可以发现,假如你选择了res位置,那么下一个位置就是res + 2 * k + 1,那么只需要判断最后一位是否冲突即可,什么时候冲突?n-res > k 时冲突

#include <bits/stdc++.h>
using namespace std;

int main(){
	int n, k;
	cin >> n >> k;
	int res;
	int cnt = 0;
	int ans[1010];
	for(int i = 1; i <= n; i ++){
		cnt = 0;
		res = i;
		while(res <= n){
			ans[cnt ++] = res;
			if(n - res <= k){
				cout << cnt << endl;
				for(int j = 0; j < cnt; j ++)	
					cout << ans[j] << ' ';
				return 0;
			}
			res = res + 2 * k + 1;
		}
	}
}

 D

交互题,第一次见,不得不说,想出这种题的人脑洞真大、、

对于每次查找的区间,模拟一下,每次都变成(l - k, r + k),然后当区间缩小到一定程度(自己把握)后,随机输出区间内的一个数,因为它给了4500次机会,所以正确率还是很高的2333

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

ll n, k;

bool judge(ll l, ll r){
	cout << l << ' ' << r << endl;
	fflush(stdout);
	string s;
	cin >> s;
	return s[0] == 'Y';
}

int main(){
	srand(time(0));
	cin >> n >> k;
	ll l = 1, r = n;
	while(1){
		l = max(l - k, 1ll);
		r = min(r + k, n);
		if(r - l <= 100){
			ll w = rand() % (r - l + 1) + l;
			if(judge(w, w))
				return 0;
		}
		else{
			ll mid = (l + r) / 2;
			if(judge(l, mid))
				r = mid;
			else
				l = mid + 1;
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38759433/article/details/82558949