博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Round #375 (Div. 2) ABCDE
阅读量:4948 次
发布时间:2019-06-11

本文共 4988 字,大约阅读时间需要 16 分钟。

#include
#include
using namespace std;int main(){ int a,b,c; cin>>a>>b>>c; cout<

 

字符串暴力模拟,感觉还是需要一点技巧的,我写的太慢了。

#include 
#include
#include
#include
#include
using namespace std;const int N = 260;char a[N];//37//_Hello_Vasya(and_Petya)__bye_(and_OK)bool is_s(char ch) { if (ch == '_' || ch == '(' || ch == ')' || ch == 0) return true; return false;}int read(char str[]) { int idx = 0; int ans = 0; while (!is_s(str[idx++])) ans++; return ans;}int main() { //freopen("in.txt", "r", stdin); int ans1 = 0, ans2 = 0, n = 12; scanf("%d", &n); scanf("%s", a); bool fg = false; for (int i = 0; i <= n;) { if (a[i] == '(') fg = true; if (a[i] == ')') fg = false; if (is_s(a[i])) { i++; } else { int tmp = read(a+i); if (!fg) ans1 = max(ans1, tmp); else ans2++; i += tmp; } } cout << ans1 << " " << ans2; return 0;}

 

应该也是sb暴力题,map乱搞的(队友写的==

#include 
#include
#include
using namespace std;const int maxn = 2010;map
mp;queue
q;int a[maxn], n, m;int main() { scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) scanf("%d", &a[i]), mp[a[i]]++; int ans = n / m; for (int i = 1; i <= m; i++) if (mp[i] < ans) q.push(i); int cnt = 0; while (!q.empty()) { int v = q.front(); q.pop(); for (int i = 1; i <= n; i++) { if (a[i] > m || mp[a[i]] > ans) mp[a[i]]--, a[i] = v, mp[v]++, cnt++; if (mp[v] >= ans) break; } } printf("%d %d\n", ans, cnt); for (int i = 1; i <= n; i++) printf("%d%c", a[i], i==n?'\n':' '); return 0;}

 

简单搜索。因为数据小,随便暴力。

#include 
#include
#include
#include
#include
#include
#include
using namespace std;const int N = 60;char mp[N][N];int vis[N][N], n, m, k;int dir[4][2] = { 0, 1, 0, -1, 1, 0, -1, 0};int dfs(int x, int y, int cnt) { if (x < 0 || x >= n || y < 0 || y >= m) return -1; if (mp[x][y] == '*' || vis[x][y]) return 0; vis[x][y] = cnt; int ans = 1; for (int i = 0; i < 4; ++i) { int tmp = dfs(x+dir[i][0], y+dir[i][1], cnt); if (ans != -1) { if (tmp == -1) ans = -1; else ans += tmp; } } return ans;}vector
> g;int main() { while (~scanf("%d%d%d", &n, &m, &k)) { for (int i = 0; i < n; ++i) scanf("%s", mp[i]); int cnt = 0, tmp, ans = 0; for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) if (!vis[i][j] && mp[i][j] == '.') if ((tmp = dfs(i, j, ++cnt)) != -1) g.push_back(make_pair(tmp, cnt)); sort(g.begin(), g.end()); tmp = g.size() - k; for (int i = 0; i < tmp; ++i) ans += g[i].first; printf("%d\n", ans); for (int k = 0; k < tmp; ++k) for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) if (vis[i][j] == g[k].second) mp[i][j] = '*'; for (int i = 0; i < n; ++i) printf("%s\n", mp[i]); } return 0;}

 

给一个无向图,要求把每个边都变成有向边,使尽可能多的点入度等于出度,问最多能满足多少个点,并输出每条边。(任意顺序)

感觉很厉害的一道题。

无向图存在欧拉回路的充要条件:一个无向图存在欧拉回路,当且仅当该图所有顶点度数都为偶数,且该图是连通图。
有向图存在欧拉回路的充要条件:一个有向图存在欧拉回路,所有顶点的入度等于出度且该图是连通图。

首先可以知道奇数度的点是不可能到达要求的。找出奇数度的点,两两一对连接,记做虚边,这样就可以保证每个点的度数都是偶数,那么就可以找到一条欧拉回路,保证每个点入度等于出度。

因为总度数是偶数,所以奇数度的点一定是偶数个。

如果图不连通,对每一个连通图求欧拉回路就好了。

然后输出图中非虚边就ok了。

好难想到啊= =队友花了半天给我讲明白的……然后还是WA了好多好多次(我是有多蠢啊T^T

#include 
using namespace std;const int N = 250;struct Edge { int next, from, to, fg; // fg: 0,2未处理 1选 -1不选} e[N*N];int head[N], cntE;void addedge(int u, int v, int fg) { e[cntE].to = v; e[cntE].from = u; e[cntE].next = head[u]; e[cntE].fg = fg; head[u] = cntE++;}int deg[N];void dfs(int u) { for (int i = head[u]; ~i; i = e[i].next) { if (e[i].fg == 0) { e[i].fg = 1; e[i^1].fg = -1; dfs(e[i].to); } else if (e[i].fg == 2) { e[i].fg = e[i^1].fg = -1; dfs(e[i].to); } }}int main() { #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); #endif // ONLINE_JUDGE int T, n, m, u, v; scanf("%d", &T); while (T--) { memset(head, -1, sizeof head); cntE = 0; memset(deg, 0, sizeof deg); scanf("%d%d", &n, &m); for (int i = 0; i < m; ++i) { scanf("%d%d", &u, &v); addedge(u, v, 0); addedge(v, u, 0); deg[u]++, deg[v]++; } int last = 0, odd = 0; for (int i = 1; i <= n; ++i) { if (deg[i] & 1) { ++odd; if (last) addedge(last, i, 2), addedge(i, last, 2), last = 0; else last = i; } } for (int i = 1; i <= n; ++i) dfs(i); printf("%d\n", n - odd); for (int i = 0; i < cntE; ++i) if (e[i].fg == 1) printf("%d %d\n", e[i].from, e[i].to); } return 0;}

 

挖坑待填……

 

转载于:https://www.cnblogs.com/wenruo/p/5931763.html

你可能感兴趣的文章
Pylint在项目中的使用
查看>>
使用nginx做反向代理和负载均衡效果图
查看>>
access remote libvirtd
查看>>
gdb调试中出现No symbol table is loaded. Use the "file" command.问题
查看>>
(4) Orchard 开发之 Page 的信息存在哪?
查看>>
ASP.NET中 GridView(网格视图)的使用前台绑定
查看>>
图像加载
查看>>
关于zxing生成二维码,在微信长按识别不了问题
查看>>
Haskell学习-高阶函数
查看>>
手动通知扫描SD卡主动生成缩略图
查看>>
js中tagName和nodeName
查看>>
PC-XP系统忘记密码怎么办
查看>>
Android实例-打电话、发短信和邮件,取得手机IMEI号(XE8+小米2)
查看>>
深入了解Oracle ASM(二):ASM File number 1 文件目录
查看>>
SQL数据库学习系列之一
查看>>
Boosting(提升方法)之AdaBoost
查看>>
CUDA学习1 在Visual Studio和CodeBlocks上配置
查看>>
JavaScript(6)——事件1.0
查看>>
2013 ACM-ICPC China Nanjing Invitational Programming Contest 总结
查看>>
【Hibernate学习笔记-5】@Formula注解的使用
查看>>