每日一题·暑假 week2
3763. 数字矩阵
https://www.acwing.com/problem/content/3766/
可以得出一个规律 通过传递可以任意让任何两个同乘-1
因此我们统计负数个数 如果为偶数说明都可变为正数
如果为奇数则让绝对值最小的数变为负数
#include
#include
#include
using namespace std;
int main()
{
int T;
cin >> T;
while(T--){
int n,m;
cin >> n >> m;
int sum = 0,minx = 1e8,cnt = 0;
for(int i = 0; i < n * m; i++){
int x;
cin >> x;
sum += abs(x);
minx = min(minx,abs(x));
if(x < 0){
cnt++;
}
}
if(cnt % 2){
cout << sum - 2 * minx << endl;
}
else {
cout << sum << endl;
}
}
}
3764. 三元数异或
https://www.acwing.com/problem/content/3767/
思路:
使用贪心
a,b选择都小的策略 如果a,b相同继续这种策略 如果a>b后(我们都规定让a成为大的那个)
由于题意是max(a,b)最小 所以后续选择策略尽可能让a最小即可 b爱怎么样怎样
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long LL;
int T;
//在ab相同时 采用尽量都小策略
int fun(string &a,string &b,char c){
if(c == '2'){
a += '1';
b += '1';
return 1;
}
else if(c == '0'){
a += '0';
b += '0';
return 1;
}
else {
a += '1';
b += '0';
return 0;
}
}
//a大于b时 选择a最小策略
void fun2(string &a,string &b,char c){
if(c == '2'){
a += '0';
b += '2';
}
else if(c == '0'){
a += '0';
b += '0';
}
else {
a += '0';
b += '1';
}
}
int main(){
cin >> T;
while(T--){
string s;
int n;
cin >> n;
cin >> s;
string a,b;
a += '1';
b += '1';
int k = n;
//规定让A成为大的那个
for(int i = 1; i < s.size(); i++){
if(!fun(a,b,s[i])){
k = i + 1;
//cout << "k=" << k << endl;
break;
}
}
for(int i = k; i < s.size(); i++){
fun2(a,b,s[i]);
}
cout<
3767. 最小的值
https://www.acwing.com/problem/content/3770/
思路:
出现a0 b1情况 p肯定取1 要想满足条件就必须在a1 b0时做手脚
其他情况p怎么取都不会影响两边和
最后如果没有出现a1 b0的情况则说明无解
#include
#include
#include
int n1,n3;//统计 10 01 情况
int n;
int a[105],b[105];
using namespace std;
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i ++ ){
cin >> a[i];
}
for (int i = 0; i < n; i ++ ){
cin >> b[i];
}
for (int i = 0; i < n; i ++ ){
if(a[i] == 1 && b[i] == 0) n1++;
else if(a[i] == 0 && b[i] == 1) n3++;
}
if(n1 == 0){
cout << "-1" << endl;
return 0;
}
int ans = (n3 + n1)/ n1;//向上取整
cout << ans << endl;
return 0;
}
3768. 字符串删减
https://www.acwing.com/problem/content/3771/
#include
#include
#include
using namespace std;
int main()
{
int n;
cin >> n;
string s;
cin >> s;
int ans = 0;
int k = 0;
for(int i = 0; i < n; i++){
while(s[i] == 'x'){
k++;
i++;
}
ans += max(0,k - 2);
k = 0;
}
cout << ans << endl;
}