F. Zero Remainder Sum || dp

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 73; int a[maxn][maxn], dp[maxn][maxn][maxn][maxn], d[maxn][maxn]; int main()
{
int n, m, k;
scanf("%d %d %d", &n, &m, &k);
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
scanf("%d", &a[i][j]);
memset(dp, -1, sizeof(dp));
memset(d, -1, sizeof(d));
for(int i = 1; i <= n; ++i) dp[i][0][0][0] = 0;
for(int i = 1; i <= n; ++i)//第i行
{
for(int j = 0; j < m; ++j)//考虑到第j+1个数是否取
{
for(int k1 = 0; k1 <= m/2; ++k1)//取k1个数
{
for(int k2 = 0; k2 < k; ++k2)//sum%k等于k2
{
if(dp[i][j][k1][k2] == -1) continue;
dp[i][j+1][k1][k2] = max(dp[i][j][k1][k2], dp[i][j+1][k1][k2]);
dp[i][j+1][k1+1][(k2+a[i][j+1])%k] = max(dp[i][j][k1][k2] + a[i][j+1], dp[i][j+1][k1+1][(k2+a[i][j+1])%k]);
}
}
}
}
d[0][0] = 0;
dp[0][m][0][0] = 0;
for(int i = 0; i < n; ++i)//前i行
{
for(int j = 0; j < k; j++)//sum%k等于j
{
for(int k1 = 0; k1 <= m / 2; k1++)
{
for(int k2 = 0; k2 < k; k2++)
{
if(d[i][j] == -1) continue;
if(dp[i+1][m][k1][k2] == -1) continue;
d[i+1][(j+k2)%k] = max(d[i][j] + dp[i+1][m][k1][k2], d[i+1][(j+k2)%k]);
}
}
}
}
printf("%d\n", d[n][0]);
return 0;
}
G. Reducing Delivery Cost || 图论最短路
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
const int maxn = 1005;
typedef pair<int, int> P;
const int INF = 0x3f3f3f3f; struct edge
{
int to, cost;
edge(int k1, int k2): to{k1}, cost{k2} {}
};
int d[maxn], road[maxn][2], dist[maxn][maxn], route[maxn][2];
vector<edge> G[maxn];
priority_queue< P, vector<P>, greater<P> > que; //第一维记录cost,第二维记录to void Dijkstra(int s)
{
memset(d, INF, sizeof(d));
d[s] = 0;
que.push(P(0, s)); while(!que.empty())
{
P p = que.top(); que.pop();
int v = p.second;
if(d[v] < p.first) continue; //去掉已经被访问过的节点和被更新过的边长
for(unsigned int i = 0; i < G[v].size(); i++) //更新边长
{
edge e = G[v][i];
if(d[e.to] > d[v] + e.cost)
{
d[e.to] = d[v] + e.cost;
que.push(P(d[e.to], e.to));
}
}
}
} int main()
{
int n, m, k, sum = 0;
scanf("%d %d %d", &n, &m, &k);
for(int i = 1; i <= m; ++i)
{
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
G[u].push_back(edge(v, w));
G[v].push_back(edge(u, w));
road[i][0] = u, road[i][1] = v;
}
for(int i = 1; i <= n; ++i)
{
Dijkstra(i);
for(int j = 1; j <= n; ++j) dist[i][j] = d[j];
}
int ans = 0;
for(int i = 1; i <= k; ++i)
{
scanf("%d %d", &route[i][0], &route[i][1]);
ans += dist[route[i][0]][route[i][1]];
}
int r = 0;
for(int i = 1; i <= m; ++i)
{
sum = 0;
for(int j = 1; j <= k; ++j)
{
int tmp = min(dist[route[j][0]][road[i][0]] + dist[route[j][1]][road[i][1]], dist[route[j][0]][road[i][1]] + dist[route[j][1]][road[i][0]]);
sum += max(dist[route[j][0]][route[j][1]] - tmp, 0);
}
r = max(r, sum);
}
printf("%d\n", ans - r);
return 0;
}

Codeforces Round #677 (Div. 3)的更多相关文章

  1. Codeforces Round #677 (Div. 3) 题解

    Codeforces Round #677 (Div. 3) 题解 A. Boring Apartments 题目 题解 简单签到题,直接数,小于这个数的\(+10\). 代码 #include &l ...

  2. Codeforces Round #677 (Div. 3)【ABCDE】

    比赛链接:https://codeforces.com/contest/1433 A. Boring Apartments 题解 模拟即可. 代码 #include <bits/stdc++.h ...

  3. Codeforces Round #677 (Div. 3) D/1433D Districts Connection

    https://codeforces.com/contest/1433/problem/D 找两个不同权值的节点A.B连起来,所有与A不同权值的连到A上,相同的连到B上. #include<io ...

  4. Codeforces Round #677 (Div. 3) E、G题解

    E. Two Round Dances #圆排列 题目链接 题意 \(n\)(保证偶数)个人,要表演一个节目,这个节目包含两种圆形舞蹈,而每种圆形舞蹈恰好需要\(n/2\)个人,每个人只能跳一种圆形舞 ...

  5. Codeforces Round #677 (Div. 3) G. Reducing Delivery Cost(dijkstra算法)

    题目链接:https://codeforces.com/contest/1433/problem/G 题解 跑 \(n\) 遍 \(dijkstra\) 得到任意两点间的距离,然后枚举哪一条边权为 \ ...

  6. Codeforces Round #677 (Div. 3) D. Districts Connection思维1200

    题目链接 Problem - 1433D - Codeforces 题目 美好的一天,从看不懂题目开始~~ Example input 4 5 1 2 2 1 3 3 1 1 1 4 1 1000 1 ...

  7. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  8. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  9. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

随机推荐

  1. Java学习的第五天

    1.值域转化的规则:值域小的类型可以自动转化成值域大的类型,值域大的类型可以强行转化成值域小的类型,但要注意精度,除了基本类型可以转换,引用类型之间也可以转换. 引用类型可以是类,借口,数组. 常见的 ...

  2. 【Kata Daily 190908】How Much?

    原题: I always thought that my old friend John was rather richer than he looked, but I never knew exac ...

  3. 找出"吸血鬼数"(Java)

    吸血鬼数是指位数为偶数的数字,可以由一 对数字相乘而得到,而这对数字各包含乘积的一半 位数的数字,其中从最初的数字中选取的数字可以任意排序.以两个0结尾的数字是不允许的,例如,下列数字都是 " ...

  4. C#练习题 if

    提示用户输入用户名,然后再提示输入密码,如果用户名是"admin"并且密码是"888888",则提示正确,否则,如果用户名不是admin还提示用户用户名不存在, ...

  5. Oracle数据库系统结构(一) 

    1.Oracle数据库系统结构概述 Oracle数据库由存放在磁盘上的数据库(DB)和对磁盘上的数据库进行管理的数据库管理系统(DBMS)两部分构成,分别对应着数据库的存储结构和软件结构. Oracl ...

  6. C的输入&输出

    格式说明符 输出 %d整型输出,%ld长整型输出, %o以八进制数形式输出整数, %x以十六进制数形式输出整数,或输出字符串的地址. %u以十进制数输出unsigned型数据(无符号数).注意:%d与 ...

  7. Jenkins - Linux下启动Jenkins报错hudson.WebAppMain#contextDestroyed: Shutting down a Jenkins instance that was still starting up

    报错截图 在Linux下直接运行jenkins.war报错,导致启动失败 报错原因 运行端口已被其他进程占用 解决方法 换个启动端口就可以啦!

  8. 重看 mb volatile atomic

    在单处理器情况下,每条指令的执行都是原子性的,但在多处理器情况下,只有那些单独的读操作或写操作才是原子性的.为了弥补这一缺点,x86提供了附加的lock前缀,使带lock前缀的读修改写指令也能原子性执 ...

  9. http 怎样关闭

    如何优雅的关闭关闭这个fd , 如果只是一个简单的fd 直接调用close 就行, 但是如果要是一个框架 那就接到 资源回收复用 内存泄漏等问题: 来看看 ngx 是用怎样的思路处理 事务结束动作: ...

  10. menuconfig

    1. menuconfig 的存在意义 原由是 项目的 config 项太多了,需要一个人性化的方式设置. menuconfig 背后是一个应用程序,用户和该应用程序交互,完成 config 设置. ...