A. Floor Number

传送门

解题思路

很明显分类讨论一下n等于1的情况以及n不等于1的情况就AC了

Code

#include
using namespace std;
int main()
{
    int t;
    cin >> t;
    while(t--) {
        int a, b;
        cin >> a >> b;
        if(a == 1) {
            cout << 1 << endl;
            continue;
        }
        cout << (ceil((a - 2) * 1.0 / b))+ 1 << endl;
    }

    return 0;
}

B. Symmetric Matrix

传送门

解题思路

我们只需要判断是否存在副对角线相等的瓷砖即可,然后再判断一下地面的边长是否为偶数(由于一个sb操作,循环写错了wa了一发)

Code

#include
using namespace std;

const int N = 105;

int a[2][2];

int main()
{
    int t,n,m;
    scanf("%d",&t);
    while(t--) {
        scanf("%d%d",&n,&m);
        bool is = false;
        for(int i = 0;i < n; ++i) {
            for(int j = 0;j < 2; ++j) {
                for(int k = 0;k < 2; ++k) {
                    scanf("%d",&a[j][k]);
                }
            }
            if(a[0][1] == a[1][0])
                    is = true;
        }
        if(is && (m % 2 == 0)) {
            puts("YES");
        }
        else {
            puts("NO");
        }
    }
    return 0;
}

C. Increase and Copy

传送门

解题思路

我们可以这样构造,先对1增加,然后在复制,这样的话操作数是一个开口朝上的函数,有极值,并且我们只用处理到sqrt(n)的数据即可,维护一个操作数

Code:

#include
using namespace std;
int main()
{
    int n;
    int t;
    scanf("%d",&t);
    while(t--) {
        scanf("%d",&n);
        int max_ = 0x3f3f3f3f;
        for(int i = 1;i * i<= n; ++i) {
            int loc = (int)ceil(1.0*n/i) - 1 + (i-1);
            if(loc < max_)
                max_ = loc;
        }
        printf("%d\n",max_);
    }

    return 0;
}

D. Non-zero Segments

传送门

解题思路

我们用map标记一下出现过的前缀和(或者叫子序列),然后一旦发现有相等的,那么必然会存在相加为0的情况,这个时候就需要插入一个数,这个数假设就去INF,反正就不让它为0,然后将map存储的前缀和信息清空,从当前位置作为第一个元素继续前缀和,注意的是,每次清空需要将map[0]标记为true

Code

#include
using namespace std;
#define ll long long

const int N = 200005;

map mp;
int a[N];

int main()
{
    int n;
    ll sum = 0;
    scanf("%d",&n);
    mp[0] = true;
    int ans = 0;
    for(int i = 0;i < n; ++i) {
        scanf("%d",&a[i]);
        sum += a[i];
        if(mp[sum]) {
            mp.clear();
            ans ++;
            sum = a[i];
            mp[0] = true;
        }
        mp[sum] = true;
    }
    printf("%d\n",ans);
    return 0;
}

本当の声を響かせてよ