题意:有N个格子,你可以任意给每个格子染色,但是要满足M个限制条件,限制条件有两种类型:
1.区间[l,r]中被染色的格子数量不少于K。
2. 区间[l,r]外被染色的格子数量不少于K。
在满足所有限制条件下求染色格子数量的最小值。
思路:首先对于染色格子。满足单调性可用二分。确定染色格子数可以用差分约束来判断是否可行(是否存在负环)
题意:分别从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;
}
题意:把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;
}