2019哈尔滨CCPC

A - Artful Paintings

题意:有N个格子,你可以任意给每个格子染色,但是要满足M个限制条件,限制条件有两种类型:
1.区间[l,r]中被染色的格子数量不少于K。
2. 区间[l,r]外被染色的格子数量不少于K。
在满足所有限制条件下求染色格子数量的最小值。

思路:首先对于染色格子。满足单调性可用二分。确定染色格子数可以用差分约束来判断是否可行(是否存在负环)\left\{\begin{matrix}S_{r}-S_{l-1}\geqslant K \\ S_{r}-S_{l-1}\geqslant mid - K \\ S_{i}-S_{i-1}\geqslant 0 \\ S_{i-1}-S_{i}\geqslant 1 \\ S_{n}-S_{0}\geqslant mid \\ S_{0}-S_{n}\geqslant -mid \end{matrix}\right.

 

 

F - Fixing Banners

题意:分别从6个字符串里选一个字母,问能否构成"harbin"

思路:DFS

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

int v[6][6];
int vis[6];
int cnt,flag,t;
string s;
string q = "harbin";

void dfs(int x)
{
    if(x == 6)
    {
        flag = 1;
        return;
    }
    for(int i = 0;i < 6;i++)
    {
        if(v[x][i] && !vis[i])
        {
            vis[i] = 1;
            dfs(x + 1);
            vis[i] = 0;
        }
    }
}

int main()
{
    scanf("%d",&t);
    while(t--)
    {
        memset(v,0,sizeof(v));
        memset(vis,0,sizeof(vis));
        for(int i = 0;i < 6;i++)
        {
            cin>>s;
            int l = s.size();
            for(int j = 0;j < l;j++)
            {
                for(int k = 0;k < 6; ++k)
                    if(s[j] == q[k])
                        v[i][k] = 1;
            }
        }
        flag = 0;
        dfs(0);
        if(flag) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

 

 

J - Justifying the Conjecture

题意:把n拆成一个质数和一个合数

思路:拆成一个偶数和一个质数最简单

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

typedef long long ll;
int t,n;

int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        if(n < 6) printf("-1\n");
        else
        {
            if(n % 2 == 0) printf("2 %d\n",n - 2);
                else printf("3 %d\n",n - 3);
        }
    }
    return 0;
}

 

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页