这场真残暴。。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;
}