涉及到INT_MIN和INT_MAX比较的时候,必须用到longlong,
如果赋值超过INT_MIN和INT_MAX,那longlong也会溢出,需要防止赋值超过INT_MIN和INT_MAX




不需要每次都判断
只需要
在要处理的字符串的后面加上一个空字符‘\0’,当下标指向‘\0’时,下标将不会继续前进
就不需要自己每次判断防止越界了


新鲜事 原文

胜利之星
25分钟前
AcWing《寒假每日一题2022》拼团优惠!https://www.acwing.com/activity/content/introduction/88/group_buy/91255/


新鲜事 原文

胜利之星
26分钟前
AcWing《寒假每日一题2022》拼团优惠!https://www.acwing.com/activity/content/introduction/88/group_buy/91255/



#include <iostream>
using namespace std;
const int N = 110;
char a[N][N];
int b[N][N];
int n, m;
int dx[8] = {1, 0, -1, 0, -1, 1, 1, -1};
int dy[8] = {0, 1, 0, -1, -1, -1, 1, 1};

void dfs(int x, int y)
{
    for (int i = 0; i < 8; i ++) {
        int tx = x + dx[i], ty = y + dy[i];
        if (tx >= 0 && tx < n && ty >= 0 && ty < m)
            b[tx][ty] ++;
    }
}
int main()
{
    cin >> n >> m;
    for (int i = 0; i < n; i ++)
        for (int j = 0; j < m; j ++) {
            cin >> a[i][j];
            if (a[i][j] == '*')
                dfs(i, j);
        }

    for (int i = 0; i < n; i ++) {
        for (int j = 0; j < m; j ++) {
            if (a[i][j] == '*') cout << a[i][j];
            else cout << b[i][j];
        }
        cout << endl;
    }
    return 0;
}



思路:
从奇偶性的角度出发,那么题目就变成能否通过操作1和操作2将数列的数都变为偶数
操作1:选一个数减去2,这个操作不会改变奇偶性
操作2:选相邻的数同时减去1,这个操作会同时改变两个数的奇偶性

遍历数列找出奇数,奇数的位置有以下情况:
奇 奇 奇:选左边相邻的数同时减1
偶 奇 奇:选右边相邻的数同时减1
偶 奇 偶:选右边相邻的数同时减1
奇 奇 偶: 选左边相邻的数同时减1

最后再遍历一次数组,判断数组是否存在奇数,若存在则输出NO

C++ 代码

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 2e5 + 10;

int n;
int a[N];

int main() {
    scanf("%d", &n);
    for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]);
    //边界条件
    if(n == 1) {
        if(a[0] % 2 == 0) printf("%s", "YES");
        else printf("%s", "NO");
        return 0;
    }
    //边界条件
    if(a[0] % 2 == 1){
        if(a[1] == 0) {
            printf("%s", "NO");
            return 0;
        }else {
            a[0] -= 1;
            a[1] -= 1;
        }
    }
    //边界条件
    if(a[n - 1] % 2 == 1) {
        if(a[n - 2] == 0){
            printf("%s", "NO");
            return 0;
        }else {
            a[n - 1] -= 1;
            a[n - 2] -= 1;
        }
    }

    for (int i = 1; i < n - 1; i ++ ) {
        if(a[i] % 2 == 1){
            //奇 奇 奇 或 奇 奇 偶
            if(a[i - 1] % 2 == 1) a[i - 1] -= 1, a[i] -= 1;
            //偶 奇 奇 或 偶 奇 偶
            else a[i + 1] -= 1, a[i] -= 1;
        }
    }

    for (int i = 0; i < n; i ++ ) {
        if(a[i] < 0 || a[i] % 2 == 1) {
            printf("%s", "NO");
            return 0;
        }
    }
    printf("%s", "YES");
    return 0;
}



垫底抽風
1小时前

算法1

由于我们输入的这个序列是无序的,而我们要把这些数字两两统一,于是我们就要先排序,这样才能使操作次数最少
我们接下来只需要累加两两相差的值,每次累加到a[i+1]-a[i]
于是我们就能得到一下代码:

for(int i=1;i<=n;i+=2)c+=a[i+1]-a[i];

最终输出c即可

参考文献

C++ 代码

#include<bits/stdc++.h>
using namespace std;
const int N=100001;
int a[N];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    sort(a+1,a+1+n);
    int c=0;
    for(int i=1;i<=n;i+=2)c+=a[i+1]-a[i];
    cout<<c;
}



新鲜事 原文

索林
1小时前
中山大学的acwing校园群号是:673204512,欢迎大家加入! 点击链接加入群聊【ACwing——中山大学群】:https://jq.qq.com/?_wv=1027&k=Fuej4wFt



#include<bits/stdc++.h>
using namespace std;
const int N = 20005, M = 2 * N;
int e[M], ne[M], h[N], w[M], idx;


void add(int a, int b, int c) {
    e[idx] = b;
    ne[idx] = h[a];
    w[idx] = c;
    h[a] = idx++;
}

int dfs(int u, int mid, int fa) {

    int res = 1;
    for (int i = h[u]; i != -1; i = ne[i]) {
        int j = e[i];
        if (j == fa || w[i] < mid) continue;
        res += dfs(j, mid, u);
    }
    return res;
}

int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        memset(h, -1, sizeof h);
        idx = 0;
        int n, y;
        cin >> n >> y;
        for (int i = 0; i < n - 1; i++) {
            int u, v, w;
            cin >> u >> v >> w;
            add(u, v, w);
            add(v, u, w);
        }
        int l = 0, r = 1e9;
        while (l < r) {
            int mid = l + r >> 1;
            if (dfs(0, mid, -1) <= y) r = mid;
            else l = mid + 1;
        }
        printf("%d\n",r);
    }
    return 0;
}



lukehan
1小时前
import java.util.*;

public class Main{
    public static void main(String args[]) throws Exception{
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        int s = sc.nextInt();
        System.out.printf("%.3f", Double.valueOf(t) * Double.valueOf(s) / 12.0);
        // This works.

    }
}
import java.util.*;

public class Main{
    public static void main(String args[]) throws Exception{
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        int s = sc.nextInt();
        System.out.printf("%.3f", Double.valueOf(t * s) / 12.0);
        // this doesn't work, why?

    }
}

为什么第一个可以,第二个不行?