大噶好,我系泡泡,今天的题难度很高(我是fw
有能力的自己搞一下,省赛的同学今天就当放松一下
目录
一丶合法日期
二丶古堡算式
三丶估计人数
四丶蓝跳跳
五丶乘积最大
题目链接:肥肠简单的模拟题
题目要求:让你判断一个月份和天数在2021年存不存在
解题思路:直接if判断即可!
#include
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
if(n>12||n<1)
{
cout<<"no";
return 0;
}
if(n==1||n==3||n==5||n==7||n==8||n==10||n==12)
{
if(m<=31&&m>=1)
{
cout<<"yes";
return 0;
}
}
else if(n==2)
{
if(m<=28&&m>=1)
{
cout<<"yes";
return 0;
}
}
else
{
if(m<=30&&m>=1)
{
cout<<"yes";
return 0;
}
}
cout<<"no";
return 0;
}
题目链接:福尔摩斯与花生的爱恨情仇
题目要求:
福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式:
ABCDE ∗ ?=EDCBA
他对华生说:“ABCDE 应该代表不同的数字,问号也代表某个数字!”
华生:“我猜也是!”
于是,两人沉默了好久,还是没有算出合适的结果来。
请你利用计算机的优势,找到破解的答案。
把 ABCDE 所代表的数字写出来。
解题思路:
五个循环就可以解决这个问题,枚举每一个数字,如果他们不同就进入相乘的过程,定义两个变量,第一个存abcde,第二个edcba,如果abcde%edcba为0那么输出!!(福尔摩斯有这么笨吗
#include
int main()
{
int a,b,c,d,e,num1,num2;
for(a=1;a<10;a++)
{
for(b=0;b<10;b++)
{
for(c=0;c<10;c++)
{
for(d=0;d<10;d++)
{
for(e=1;e<10;e++)
{
if(a!=b && a!=c && a!=d && a!=e && b!=c && b!=d && b!=e && c!=d && c!=e && d!=e)
{
num1=e+d*10+c*100+b*1000+a*10000;
num2=a+b*10+c*100+d*1000+e*10000;
if(num2%num1==0)
{
printf("%d",num1);
}
}
}
}
}
}
}
return 0;
}
题目链接:找人数
题目要求:
解题思路:
二分图或者匈牙利或者bfs判断(这个数据不大所以爆可以,群里的怂佬爆的,不过他是java
或者最短路啥的都能过不过俺实在是不会,不过我找了一个大佬的二分图题解来给大家欣赏一下,
这是国赛题,一般也没这么难得我感觉,需要的大佬可看看
#include
#include
#include
using namespace std;
const int N = 410, M = 100010, K = 22, INF = 0x3f3f3f3f;
int h[N], e[M], f[M], ne[M], idx;
void add(int a, int b, int c)
{
e[idx] = b, f[idx] = c, ne[idx] = h[a], h[a] = idx ++;
e[idx] = a, f[idx] = 0, ne[idx] = h[b], h[b] = idx ++;
}
int n, m, S, T;
int hs[N], d[N], q[N];
bool bfs()
{
memset(d, -1, sizeof d);
d[S] = 0;
int hh = 0, tt = -1;
q[ ++ tt] = S;
hs[S] = h[S];
while(hh <= tt)
{
int u = q[hh ++];
for(int i = h[u]; ~i; i = ne[i])
{
int j = e[i];
if(d[j] == -1 and f[i])
{
d[j] = d[u] + 1;
hs[j] = h[j];
if(j == T) return true;
q[ ++ tt] = j;
}
}
}
return false;
}
int find(int u, int limit)
{
if(u == T) return limit;
int flow = 0;
for(int i = hs[u]; ~i and flow < limit; i = ne[i])
{
hs[u] = i;
int j = e[i];
if(d[j] == d[u] + 1 and f[i])
{
int t = find(j, min(f[i], limit - flow));
if(!t) d[j] = -1;
f[i] -= t, f[i ^ 1] += t, flow += t;
}
}
return flow;
}
int dinic()
{
int res = 0, flow;
while(bfs()) while(flow = find(S, INF)) res += flow;
return res;
}
char s[K][K];
int num[K][K];
int g[N][N];
int main()
{
memset(h, -1, sizeof h);
int n, m;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i ++) scanf("%s", s[i] + 1);
S = N - 2, T = N - 1;
int cnt = 0;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
if(s[i][j] == '1')
num[i][j] = ++ cnt;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
if(num[i][j])
{
int a = num[i][j];
add(S, a, 1);
add(cnt + a, T, 1);
int b = num[i + 1][j];
if(a) g[a][b] = true;
b = num[i][j + 1];
if(b) g[a][b] = true;
}
for(int k = 1; k <= cnt; k ++)
for(int i = 1; i <= cnt; i ++)
for(int j = 1; j <= cnt; j ++)
if(g[i][k] and g[k][j]) g[i][j] = true;
for(int i = 1; i <= cnt; i ++)
for(int j = 1; j <= cnt; j ++)
if(g[i][j])
add(i, cnt + j, 1);
printf("%d\n", cnt - dinic());
return 0;
}
题解大佬是来自acwing的滑稽_ωノ
题目链接:蓝跳跳(杀人啦
题目要求:
解题思路:
这题直接跳过 太难了 A组国赛题(执佬太杀我了
题目链接:大大大
题目要求:
给定N个整数A1, A2, ... AN。请你从中选出K个数,使其乘积最大。
请你求出最大的乘积,由于乘积可能超出整型范围,你只需输出乘积除以1000000009的余数。
注意,如果X<0, 我们定义X除以1000000009的余数是负(-X)除以1000000009的余数。
即:0-((0-x) % 1000000009)
解题思路:
dp,寄!