第九届北京化工大学程序设计竞赛网络同步赛
来源:互联网 发布:nosql数据库 mysql 编辑:程序博客网 时间:2024/04/28 18:54
A题:dfs,从打到搜索
#include<iostream>#include<math.h>#include<stdio.h>#include<algorithm>#include<string.h>#include<vector>#include<queue>#include<map>#include<set>#define B(x) (1<<(x))using namespace std;typedef long long ll;typedef unsigned long long ull;const int oo = 0x3f3f3f3f;const ll OO = 0x3f3f3f3f3f3f3f3f;const double eps = 1e-9;#define lson rt<<1#define rson rt<<1|1void cmax(int& a, int b){ if (b>a)a = b; }void cmin(int& a, int b){ if (b<a)a = b; }void cmax(ll& a, ll b){ if (b>a)a = b; }void cmin(ll& a, ll b){ if (b<a)a = b; }void cmax(double& a, double b){ if (a - b < eps) a = b; }void cmin(double& a, double b){ if (b - a < eps) a = b; }void add(int& a, int b, int mod){ a = (a + b) % mod; }void add(ll& a, ll b, ll mod){ a = (a + b) % mod; }const ll MOD = 1000000007;const int maxn = 50;int a[maxn];ll sum[maxn];int f;void dfs(int s, int l){if (f) return;if (l > sum[s]) return;if (l == sum[s] || l == 0){f = 1;return;}for (int i = s; i >= 1; i--){if (l >= a[i])dfs(i - 1, l - a[i]);}}int main(){int n, m;while (scanf("%d %d", &n, &m) != EOF){sum[0] = 0;for (int i = 1; i <= n; i++){scanf("%d", &a[i]);sum[i] = sum[i - 1] + a[i];}f = 0;dfs(n, m);if (f) printf("Yes\n");else printf("No\n");}return 0;}
B题:ac自动机,将前后相减等到的串去匹配,由于有负值,所以用结构体,用map存边。
#include<iostream>#include<math.h>#include<stdio.h>#include<algorithm>#include<string.h>#include<vector>#include<queue>#include<map>#include<set>using namespace std;#define B(x) (1<<(x))typedef long long ll;const int oo = 0x3f3f3f3f;const ll OO = 1LL << 61;const int MOD = 10007;const int maxn = 110000;const int maxm = 1000005;const int SIZE = 1000005;int Next_[maxm];//const int type=4; inline int gcd(int a, int b){ return b == 0 ? a : gcd(b, a%b);} struct Node{ int x; Node(){} Node(int a){ x = a; } bool operator==(const Node& a)const{ return x == a.x; } bool operator!=(const Node& a)const{ return x != a.x; } bool operator<(const Node& a)const{ return x < a.x; } }a[maxn], b[maxn]; void input(Node buff[], int len){ int x, y; scanf("%d", &x); for (int i = 1; i<len; i++){ scanf("%d", &y); buff[i] = Node(y - x); x = y; }} map<Node, int>Next[SIZE];int fail[SIZE], flag[SIZE];int cnt, root; int newNode(){ Next[cnt].clear(); flag[cnt++] = 0; return cnt - 1;} void Init(){ cnt = 1; root = newNode();} void Insert(Node buff[], int len){ int now = root; Node k; for (int i = 1; i <= len; i++){ k = buff[i]; if (Next[now][k] == 0) Next[now][k] = newNode(); now = Next[now][k]; }//for flag[now]++;} void build(){ fail[root] = 0; Node k; queue<int>Q; ///注:next[now][i] <=> it->second ; i <=>it->first; for (map<Node, int>::iterator it = Next[root].begin(); it != Next[root].end(); ++it){ fail[it->second] = root; Q.push(it->second); }//for while (!Q.empty()){ int now = Q.front(); Q.pop(); flag[now] += flag[fail[now]]; for (map<Node, int>::iterator it = Next[now].begin(); it != Next[now].end(); ++it){ int temp = fail[now]; int nxt = Next[temp][it->first]; while (temp&&!nxt){ temp = fail[temp]; nxt = Next[temp][it->first]; } if (temp) fail[it->second] = nxt; else fail[it->second] = root; Q.push(it->second); }//for }//while} ll Search(Node buff[], int len){ int now = root; ll ans = 0; for (int i = 1; i <= len; i++){ int nxt = Next[now][buff[i]]; while (now&&!nxt){ now = fail[now]; nxt = Next[now][buff[i]]; } if (now) now = nxt; else now = root; ans += flag[now]; }//for return ans;} void get_next(Node T[], int len){ int i = 0; Next_[i] = -1; int j = -1; while (i<len) { if (j == -1 || T[i] == T[j]){ i++; j++; Next_[i] = j; } else j = Next_[j]; }} ll kmp(Node S[], Node T[], int lenS, int lenT){ ll ans = 0; int i = 0, j = 0; while (i<lenS){ if (j == -1 || S[i] == T[j]){ i++; j++; } else j = Next_[j]; if (j == lenT) ans++; }//for return ans;} int main(){ int T, m, n, k; ll ans; while (scanf("%d %d", &n, &m) != EOF){ Init(); input(a, n); ans = 0; if (m > 1){ for (int i = 1; i <= m; i++){ scanf("%d", &k); input(b, k); if (k > 1) Insert(b, k - 1); else ans += n; } build(); ans += Search(a, n - 1); } else{ scanf("%d", &k); input(b, k); if (k > 1){ get_next(b + 1, k - 1); ans = kmp(a + 1, b + 1, n - 1, k - 1); } else ans += n; } cout << ans << endl; } return 0;}
D题:二分图,先判断二分图,然后二分匹配。
#include<iostream>#include<math.h>#include<stdio.h>#include<algorithm>#include<string.h>#include<string>#include<vector>#include<queue>#include<map>#include<set>#define B(x) (1<<(x))using namespace std;typedef long long ll;typedef unsigned long long ull;void cmax(int& a, int b){ if (b>a)a = b; }void cmin(int& a, int b){ if (b<a)a = b; }void cmax(ll& a, ll b){ if (b>a)a = b; }void cmin(ll& a, ll b){ if (b<a)a = b; }void add(int& a, int b, int mod){ a = (a + b) % mod; }void add(ll& a, ll b, ll mod){ a = (a + b) % mod; }#define lson rt<<1#define rson rt<<1|1const int oo = 0x3f3f3f3f;const ll OO = 0x3f3f3f3f3f3f3f3f;const ll MOD = 1000000007;const int maxn = 333;map<string, int> mat;char s1[20], s2[20];int g[maxn][maxn], col[maxn];int mac[maxn], vis[maxn];int n; bool jud(){ queue<int>q; memset(col, -1, sizeof col); for (int i = 1; i <= n; i++){ if (col[i] != -1)continue; col[i] = 1; q.push(i); while (!q.empty()){ int u = q.front(); q.pop(); for (int v = 1; v <= n; v++)if (g[u][v]){ if (col[v] == -1){ col[v] = 1 - col[u]; q.push(v); } else if (col[u] == col[v]) return false; } } } return true;} int dfs(int u){ for (int i = 1; i <= n; i++){ if (g[u][i] && !vis[i]){ vis[i] = 1; if (mac[i] == -1 || dfs(mac[i])){ mac[i] = u; return 1; } } } return 0;} int Match(){ memset(mac, -1, sizeof mac); int ans = 0; for (int i = 1; i <= n; i++){ memset(vis, 0, sizeof vis); ans += dfs(i); } return ans;} int main(){ int m; while (scanf("%d %d", &n, &m) != EOF){ int cnt = 0; mat.clear(); memset(g, 0, sizeof g); for (int i = 1; i <= m; i++){ scanf("%s %s", s1, s2); if (!mat[s1])mat[s1] = ++cnt; if (!mat[s2])mat[s2] = ++cnt; g[mat[s1]][mat[s2]] = 1; g[mat[s2]][mat[s1]] = 1; } if (!jud()) puts("No"); else{ printf("%d\n", Match()); } } return 0;}
E题:
#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;int a[2][2], b[2][2], c[2][2], g[2];#define exp 1e-6int main(){ int n; while (~scanf("%d", &n)) { int x, y, z, m; a[0][0] = a[1][1] = a[1][0] = a[1][1] = 0; b[0][0] = b[1][1] = b[1][0] = b[1][1] = 0; c[0][0] = c[1][1] = c[1][0] = c[1][1] = 0; g[0] = g[1] = 0; for (int i = 0; i < n; i++) { scanf("%d%d%d%d", &x, &y, &z, &m); a[m][x]++; b[m][y]++; c[m][z]++; g[m]++; } scanf("%d%d%d", &x, &y, &z); double xx, yy; xx = (a[0][x] + 1.0 / n)*b[0][y] / n*c[0][z] / n*g[0]; yy = (a[1][x] + 1.0 / n)*b[1][y] / n*c[1][z] / n*g[1]; if (yy - xx > exp) puts("Come on guys,you can do it!"); else puts("Poor guys,you can go back to sleep now.."); }}
F题:结论题
G题:TL
H题:ORZ
I:贪心,根据上车的人数从小到大排序,然后从终点站到这往前推,如果出现负值说明这种情况无解。
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;struct node{ int x, y;}a[110000]; bool cmp(node a, node b){ return a.y < b.y;}int main(){ int n; while (~scanf("%d", &n)) { for (int i = 0; i < n; i++) scanf("%d%d", &a[i].x, &a[i].y); sort(a, a + n, cmp); long long sum = 0; bool flag = true; if (a[0].y != 0) puts("No"); else { for (int i = 0; i < n; i++) { sum -= a[i].y; if (sum < 0) { flag = false; break; } sum += a[i].x; } if (flag) puts("Yes"); else puts("No"); } }}
J题:乱搞
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<math.h>using namespace std;int x[1100000], y[1100000];int main(){ int n; while (~scanf("%d", &n)) { for (int i = 0; i < n; i++) scanf("%d%d", &x[i], &y[i]); sort(y, y + n); int k = y[n / 2]; long long sum = 0; for (int i = 0; i < n; i++) sum += abs(y[i] - k); printf("%lld\n", sum); }}
0 0
- 第九届北京化工大学程序设计竞赛网络同步赛
- 第九届北京化工大学程序设计竞赛网络同步赛 A
- 第九届北京化工大学程序设计竞赛网络同步赛 A (搜索)
- 第九届北京化工大学程序设计竞赛(部分题解)
- 第九届北京化工大学程序设计竞赛训练总结【7/10】
- ACdream-1734 Can you make a water problem?【模拟排序贪心】 第九届北京化工大学程序设计竞赛
- 师创杯”山东理工大学第九届ACM程序设计竞赛(网络同步赛)--I皮卡丘的梦想2
- 第十五届北京师范大学程序设计竞赛决赛(网络同步赛)
- 第十五届北京师范大学程序设计竞赛决赛(网络同步赛)
- 第十五届北京师范大学程序设计竞赛决赛(网络同步赛)
- 第十五届北京师范大学程序设计竞赛决赛(网络同步赛)
- 北京化工大学 程序设计实训(报告)
- 第七届北京交通大学ACM程序设计竞赛网络预赛一
- 第七届北京交通大学ACM程序设计竞赛网络预赛二
- 中南大学第九届大学生程序设计竞赛网络预选赛
- 安徽大学第九届大学生程序设计竞赛 网络预选赛
- 安徽大学第九届大学生程序设计竞赛 网络预选赛 A
- 安徽大学第九届大学生程序设计竞赛 网络预选赛 B
- zoj 1097 Code the Tree(记忆化深搜构造树)
- 求大数阶乘算法
- HTML5之7 __Canvas: 缩放、旋转、创建阴影
- 机房重构---为什么要把卡表和学生表分开
- 黑马程序员----Map集合的总结
- 第九届北京化工大学程序设计竞赛网络同步赛
- Android_UI_点击按钮切换背景效果实现
- WMware下的linux服务器使用动态域名
- maven一些问题
- 跨平台客户端开发经验总结
- SQL应用与开发:(八)数据完整性
- github下载的源码打包成jar
- HashMap原理及哈希函数相关(转载知识点整合)
- 特大喜讯 免费大奉送