博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Round #490 (Div. 3)-赛后补题
阅读量:4957 次
发布时间:2019-06-12

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

思维太僵硬了,我从余数入手,嫩是记录不了每个数要操作多少次。但是如果考虑每个数的贡献,即操作多少次能使得满足条件,就好写了,实际上也是暴力

#include
#define ll long long#define P pair
#define pb push_back#define lson root << 1#define INF (int)2e9 + 7#define maxn (int)2e5 + 7#define rson root << 1 | 1#define LINF (unsigned long long int)1e18#define mem(arry, in) memset(arry, in, sizeof(arry))using namespace std;int n, m, t;int a[maxn], pre[maxn], sum[maxn];int Find(int x){ return (sum[x] < t ? x : pre[x] = Find(pre[x]));}int main(){ ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> n >> m; for(int i = 0; i < m; i++) pre[i] = (i + 1) % m; t = n / m; ll ans = 0; for(int i = 1; i <= n; i++) { int tp = 0; cin >> tp; int x = Find(tp % m); sum[x]++; a[i] = (x - tp % m + m) % m + tp; ans += a[i] - tp; } cout << ans << endl; for(int i = 1; i <= n; i++) cout << a[i] << " "; cout << endl; return 0;}

题解:先从起点搜索一遍,对不能到达的点加一条从首都到这个点的边(加边操作只能是思维上的,不能真的addedge(st, i),因为后面还有删除边的操作),并标记,假如后加入的边能访问到先前的点,就删除原先对应加的边(说明允许犯错)。

#include
#define ll long long#define P pair
#define pb push_back#define lson root << 1#define INF (int)2e9 + 7#define maxn (int)5e3 + 7#define rson root << 1 | 1#define LINF (unsigned long long int)1e18#define mem(arry, in) memset(arry, in, sizeof(arry))using namespace std;int n, m, tot, st;int head[maxn];bool use[maxn], connect[maxn], link[maxn];struct node{ int to, next; } g[maxn << 1];void Inite(){ tot = 0; mem(head, -1);}void addedge(int u, int v){ g[tot].to = v; g[tot].next = head[u]; head[u] = tot++;}void DFS(int u){ use[u] = connect[u] = 1; //connect数组表示从首都能到这个点 for(int i = head[u]; i != -1; i = g[i].next){ int v = g[i].to; if(!use[v]){ link[v] = 0; //删除标记 DFS(v); } }}int main(){ cin >> n >> m >> st; Inite(); for(int i = 1; i <= m; i++){ int u, v; cin >> u >> v; addedge(u, v); } DFS(st); mem(use, 0); for(int i = 1; i <= n; i++){ if(!connect[i]){ link[i] = 1; DFS(i); mem(use, 0); } } int res = 0; for(int i = 1; i <= n; i++) if(link[i]) res++; cout << res << "\n"; return 0;}

题解:dp[ i ][ j ]:同一爱好的 i 个人分同样的 j 件物品得到的最大价值。

#include
#define ll long long#define P pair
#define pb push_back#define lson root << 1#define INF (int)2e9 + 7#define maxn (int)1e5 + 7#define rson root << 1 | 1#define LINF (unsigned long long int)1e18#define mem(arry, in) memset(arry, in, sizeof(arry))using namespace std;int n, k;int cntf[maxn], cnta[maxn], h[15], dp[505][5005];int main(){ cin >> n >> k; int m = n * k; int tp; for(int i = 1; i <= m; i++) cin >> tp, cnta[tp]++; for(int i = 1; i <= n; i++) cin >> tp, cntf[tp]++; for(int i = 1; i <= k; i++) cin >> h[i]; for(int i = 1; i <= n; i++) { for(int j = 1; j <= m; j++){ for(int p = 1; p <= min(j, k); p++) dp[i][j] = max(dp[i][j], dp[i - 1][j - p] + h[p]); } } ll ans = 0; for(int i = 0; i < maxn; i++) if(cntf[i]) ans += (ll)dp[cntf[i]][cnta[i]]; cout << ans << "\n"; return 0;}

 

转载于:https://www.cnblogs.com/zgglj-com/p/9215006.html

你可能感兴趣的文章
C# 远程图片下载到本地
查看>>
Next Closest Time
查看>>
java中的依赖注入和控制反转
查看>>
京东“加关注”代码“ID必须以zx开头”的解决方法
查看>>
C# Socket系列三 socket通信的封包和拆包
查看>>
HOT SUMMER 每天都是不一样,积极的去感受生活 C#关闭IE相应的窗口 .
查看>>
windows平台上编译mongdb-cxx-driver
查看>>
optionMenu-普通菜单使用
查看>>
MVC3分页传2参
查看>>
数学家怎么把球面内表面翻出到外表面——斯梅尔悖论
查看>>
2016-2017-2点集拓扑作业[本科生上课时]讲解视频
查看>>
【译】Hello Kubernetes快速交互实验手册
查看>>
appium(13)- server config
查看>>
director.js:客户端的路由---简明中文教程
查看>>
图形学噪声解析
查看>>
IIS负载均衡-Application Request Route详解第六篇:使用失败请求跟踪规则来诊断ARR...
查看>>
javascript中的自执行匿名函数
查看>>
linux权限详解
查看>>
asp.net 验证码技术
查看>>
微信公众平台开发培训
查看>>