一、合法日期
题目链接:肥肠简单的模拟题
题目要求:让你判断一个月份和天数在2021年存不存在
解题思路:直接if判断即可!
#include <iostream> 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<stdio.h> 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<cstdio> #include<cstring> #include<algorithm> 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,寄!