每日一题·暑假 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;
}

相关