A. Three Piles of Candies(简单)
题目链接:codeforces 1196A
题意:
给三堆糖,然后一人拿一堆,多的一堆分掉,然后谁多扔掉一些,保证两个人的糖数量相等,求两个人拿的糖最多为多少
题解:
无(太简单)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+9;
int main(){
int q;
cin >> q;
while(q--){
ll a, b, c;
cin >> a >> b >>c;
cout << (a + b + c) / 2 << endl;
}
return 0;
}
B. Odd Sum Segments(思维)
题目链接:codeforces 1196B
题意:
给出一个n,(n个数), k(k个子段),然后要求每个字段(连续的)的和为奇数,如果可以,输出"YES",并输出子段的右边界,否则输出"NO"
样例:
5 3
7 18 3 14 1
输出 1 3 5 左边界就上上一个的右边界
7 ,18 + 3 , 14 + 1 分别是一个和为奇数的子段
题解:
只用判断a[i]是否为奇数,如果是奇数,记住下标,如果奇数的个数小于k,也就是说每个奇数单独都不能构成k个和为奇数的子段,输出NO ,或者 k % 2 != 奇数的个数,那么构不成 和为奇数的k个子段。
举例说明:
1 2 3 4 5 6 最多能构成3个和为奇数的子段,无法构成 比3个多的奇数和的子段
也不能构成2个子段和为奇数的子段 1+2 3+4+5+6(不为奇数)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5+9;
int main(){
int q;
cin >> q;
while(q--){
vector<int> v;
int n, k, u, w = 1;
cin >> n >> k;
for(int i = 1; i <= n; i++){
cin >> u;
if(u % 2 != 0){
v.push_back(i);
}
}
w = v.size();
if(k > w || k % 2 != w % 2){
cout << "NO" << endl;
}
else{
cout << "YES" << endl;
for(int i = 0; i < k - 1; i++){
cout << v[i] << " ";
}
cout << n << endl;
}
}
return 0;
}
C. Robot Breakout(思维)
题目链接:codeforces 1196C
题意:
给出n个点,可以对点进行操作,上下左右平移,如果f1 = 1,可以进行左移,如果f2 = 1,可以进行上移,如果f3 = 1,可以进行右移,如果f4 = 1,可以进行下移,问最终能否移动到一个点上。
题解:
设置左右边界,如果左边界不超过右边界,上边界不超过下边界,就可以平移到一个点上
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5;
int main(){
int q;
cin >> q;
while(q--){
int n, xl = -maxn, xr = maxn, yu = maxn, yd = -maxn;
int x, y, f1, f2, f3, f4;
cin >> n;
for(int i = 1; i <= n; i++){
cin >> x >> y >> f1 >> f2 >> f3 >> f4;
if(f1 == 0){ // 左边界
xl = max(xl, x);
}
if(f3 == 0){ // 右边界
xr = min(xr, x);
}
if(f2 == 0){ // 上边界
yu = min(yu, y);
}
if(f4 == 0){ // 下边界
yd = max(yd, y);
}
}
if(xl > xr || yu < yd){
cout << 0 << endl;
}
else{
cout << 1 << " " << xl << " " << yu << endl;
}
}
return 0;
}