A
因为都 >= 1
c实际上只有奇数和偶数,消掉也就是0和1
如果c是1,那么与一个b结合差值就成了1
把剩下的b与a结合即可
所以b不影响,只有a和c会影响结果是1或0
#include<bits/stdc++.h>
using namespace std;
// A 500分题
int main()
{
int t;
cin >> t;
while(t --)
{
int a, b, c;
cin >> a >> b >> c;
cout << ((a + c) & 1) << endl;
}
}
B
统计0和1的数量
必须取1个1
每个0都可取可不取,也就是有2种选择,所以每个0乘2
#include<bits/stdc++.h>
using namespace std;
// B 750分题
#define int long long
signed main()
{
int t;
cin >> t;
while(t --)
{
int n, n0 = 0, n1 = 0;
cin >> n;
for(int i = 0; i < n; i ++)
{
int x;
cin >> x;
if(x == 0) n0 ++;
if(x == 1) n1 ++;
}
cout << n1 * (1ll << n0) << endl;
}
}
C
#include<bits/stdc++.h>
using namespace std;
// C 1500分题
int main()
{
int t;
cin >> t;
while(t --)
{
int n;
cin >> n;
string s;
cin >> s;
int res = -1;
for(int i = 0; i < 26; i ++) // 枚举a—z
{
int l = 0, r = n - 1, cnt = 0;
while(l < r)
{
if(s[l] == s[r]) l ++, r --; // 对称
else if(s[l] - 'a' == i) l ++, cnt ++; // 不对称但是可以删
else if(s[r] - 'a' == i) r --, cnt ++; // +1
else break;
}
// 删除后l左边和r右边是对称的
if(l >= r) // 删除后成功回文了
{
if(res == -1) res = cnt;
else res = min(res, cnt);
}
}
cout << res << endl;
}
}
D
如果有偶数个,两两相消即可。
如果有奇数个,我们让除了前三个以外的偶数个两两相消
前三个我们要保证没有0出现,所以我选择枚举三种一消二的可能
#include<bits/stdc++.h>
using namespace std;
// D 1750分题
int main()
{
int t;
cin >> t;
while(t --)
{
int n;
cin >> n;
vector<int> a(n);
for(int i = 0; i < n; i ++) cin >> a[i];
if(n & 1)
{
if (a[1] + a[2])
cout << a[1] + a[2] << ' ' << -a[0] << ' ' << -a[0] << ' ';
else if(a[0] + a[2])
cout << -a[1] << ' ' << a[0] + a[2] << ' ' << -a[1] << ' ';
else if(a[0] + a[1])
cout << -a[2] << ' ' << -a[2] << ' ' << a[0] + a[1] << ' ';
for(int i = 3; i < n; i += 2)
cout << a[i + 1] << ' ' << -a[i] << ' ';
}
else
{
for(int i = 0; i < n; i += 2)
cout << a[i + 1] << ' ' << -a[i] << ' ';
}
cout << endl;
}
}