A. Three Piles of Candies

签到题

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

LL a[3];

int main()
{
    int q;
    scanf("%d", &q);
    while(q--)
    {
        scanf("%lld %lld %lld", &a[0], &a[1], &a[2]);
        sort(a, a+3);
        LL alice, bob;
        alice = a[0], bob = a[1];
        LL tmp = bob - alice;
        LL tmp2 = a[2] - tmp;
        alice += tmp2 / 2;
        bob += tmp2 / 2;
        alice += tmp;
        if(a[2] % 2 == 1)
            alice += 1;
        printf("%lld\n", min(alice, bob));

    }


    return 0;
}

 

B. Odd Sum Segments

打表记录从开始当前数字有多少个奇数。

注意:

偶数个数分为奇数个组不行
奇数个数分为偶数个组也不行
奇数个数小于k也不行

输出第1、2、3......k-1个奇数的下表,这是前k-1组,剩下的是第k组。

#include <bits/stdc++.h>
using namespace std;
const int N = 200010;

int a[N];
int b[N];
vector<int> ve;

int main()
{
    int q;
    scanf("%d", &q);
    while(q--)
    {
        int n, k;
        scanf("%d %d", &n, &k);
        for(int i=1; i<=n; i++)
        {
            scanf("%d", &a[i]);
        }
        b[0] = 0;
        for(int i=1; i<=n; i++)     // 打表记录奇数个数
        {
            if(a[i]&1)  b[i] = b[i-1] + 1;
            else    b[i] = b[i-1];
        }
        if(b[n] % 2 ==0 && k%2 == 1)
            printf("NO\n");
        else if(b[n]%2 == 1 && k%2 == 0)
            printf("NO\n");
        else if(b[n] < k)
            printf("NO\n");
        else
        {
            printf("YES\n");
            int cnt = 1;
            for(int i=1; i<=n; i++)
            {
                
                if(cnt == k)
                    break;
                if(b[i] == cnt)
                {
                     printf("%d ", i);
                     cnt ++;
                }
                   
            }
            printf("%d\n", n);
        }
        

    }


    return 0;
}

 

C. Robot Breakout

根据条件缩小x和y的范围,最后输出x的最小值和y的最小值

#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 100010;

struct node{
    int x, y;
    int left, up, right, down;
};
struct node a[N];

int main()
{
    int q;
    scanf("%d", &q);
    while(q--)
    {
        int n;
        scanf("%d", &n);
        for(int i=0; i<n; i++)
            scanf("%d %d %d %d %d %d", &a[i].x, &a[i].y, &a[i].left, &a[i].up, &a[i].right, &a[i].down);
        int minx = -INF, maxx = INF;
        int miny = -INF, maxy = INF;

        for(int i=0; i<n; i++)  // 缩减范围
        {
            if(a[i].left == 0 && a[i].x > minx)
                minx = a[i].x;
            if(a[i].right == 0 && a[i].x < maxx)
                maxx = a[i].x;
            if(a[i].up == 0 && a[i].y < maxy)
                maxy = a[i].y;
            if(a[i].down == 0 && a[i].y > miny)
                miny = a[i].y;            
        }
        if(minx > maxx || miny > maxy)
            printf("0\n");
        else
        {
            if(minx == -INF)
                minx = -100000;
            if(miny == -INF)
                miny = -100000;
            printf("1 %d %d\n", minx, miny);
            // if(maxx == INF)
            //     maxx = 100000;
            // if(maxy == INF)
            //     maxy == 100000;
            // printf("1 %d %d\n", maxx, maxy);
        }
        

    }


    return 0;
}