题目描述:

恬恬的生日临近了。宇扬给她准备了一个大 蛋糕。

正如往常一样,宇扬在蛋糕上插了nnn支蜡烛,并把蛋糕分为mmm个区域。因为某种原因,他必须把第iii根蜡烛插在第aia\_iai​个区域或第bib\_ibi​个区域。区域之间是不相交的。宇扬在一个区域内同时摆放xxx支蜡烛就要花费x2x^2x2的时间。宇扬布置蛋糕所用的总时间是他在每个区域花的时间的和。

宇扬想快些见到恬恬,你能告诉他布置蛋糕最少需要多少时间吗?

输入:

第一行包含两个整数nnn,mmm(1≤n≤501 \le n \le 501≤n≤50, 2≤m≤502\le m\le 502≤m≤50)。

接下来nnn行,每行两个整数ai,bia\_i,b\_iai​,bi​(1≤ai,bi≤m1 \le a\_i, b\_i \le m1≤ai​,bi​≤m)。

输出:

一个整数表示答案。

样例输入
3 3
1 2
1 2
1 2
样例输出
5
描述

题目描述:

恬恬的生日临近了。宇扬给她准备了一个大 蛋糕。

正如往常一样,宇扬在蛋糕上插了nnn支蜡烛,并把蛋糕分为mmm个区域。因为某种原因,他必须把第iii根蜡烛插在第aia\_iai​个区域或第bib\_ibi​个区域。区域之间是不相交的。宇扬在一个区域内同时摆放xxx支蜡烛就要花费x2x^2x2的时间。宇扬布置蛋糕所用的总时间是他在每个区域花的时间的和。

宇扬想快些见到恬恬,你能告诉他布置蛋糕最少需要多少时间吗?

输入:

第一行包含两个整数nnn,mmm(1≤n≤501 \le n \le 501≤n≤50, 2≤m≤502\le m\le 502≤m≤50)。

接下来nnn行,每行两个整数ai,bia\_i,b\_iai​,bi​(1≤ai,bi≤m1 \le a\_i, b\_i \le m1≤ai​,bi​≤m)。

输出:

一个整数表示答案。

题意 :

  给你 n 根蜡烛,同时告诉你每根蜡烛可以插在哪个区域中,对于同一个区域内插入的蜡烛总的花费为此区域内蜡烛数量的平方,问最小的花费是多少

思路分析 :

  贪心对于此问题是不正确的,考虑一下网络流建图

  考虑费用流时把每个part拆成n个点,选择第i个点的代表为放置i块蛋糕和(i - 1)块蛋糕的时间差,这个时间差是递增的,因此在费用流的过程中必定会从小到大选择
具体建图:左边n个点代表n个蛋糕,右边m * n个点代表m个part,每个part拆成n个点。源点向每个左边的点连一条流量1费用0的边,每个右边的点向汇点连一条流量1费用0的编。每个蛋糕向可以放的两个part的所有点连边,连向第i个点的费用为i^2 - (i - 1)^2,流量为1。这样求最小费用流既为答案。

代码示例 :

#include <bits/stdc++.h>
using namespace std; const int maxn = 1e4;
const int maxm = 1e5;
const int inf = 0x3f3f3f3f;
struct Edge
{
int to,next,flow,cost; // flow 表示水现有的流量
}edge[maxm];
int head[maxn],tol;
int pre[maxn],dis[maxn];
bool vis[maxn];
int N; //节点个数,编号0->N-1 !全局变量 需要init赋值或主函数改变 void init(int n)
{
N=n;
tol = 0;
memset(head,-1,sizeof(head));
} void addedge(int u,int v,int cap,int cost) //边起点,终点,流量,费用
{
edge[tol].to = v;
edge[tol].cost = cost;
edge[tol].flow = cap;
edge[tol].next = head[u];
head[u] = tol++;
edge[tol].to = u;
edge[tol].cost = -cost;
edge[tol].flow = 0;
edge[tol].next = head[v];
head[v] = tol++;
} bool spfa(int s,int t) //单源最短路径算法 可判断负环
{
queue<int >q;
for(int i=0;i<N;i++)
{
dis[i] = inf;
vis[i] = false;
pre[i] = -1;
}
dis[s] = 0;
vis[s] = true;
q.push(s);
while(!q.empty())
{
int u = q.front();
q.pop();
vis[u] = false;
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v= edge[i].to;
if(edge[i].flow && dis[v]>dis[u]+edge[i].cost)
{
dis[v] = dis[u] + edge[i].cost;
pre[v] = i;
if(!vis[v])
{
vis[v] = true;
q.push(v);
}
}
}
}
if(pre[t]==-1) return false;
else return true;
} int MCMF(int s,int t,int &cost) //MinCostMaxFlow 返回最大流,cost存最小费用
{
int flow = 0;
cost = 0;
while(spfa(s,t))
{
int Min = inf;
for(int i= pre[t];i!=-1;i=pre[edge[i^1].to])
{
if(Min>edge[i].flow)
Min=edge[i].flow;
}
for(int i= pre[t];i!=-1;i=pre[edge[i^1].to])
{
edge[i].flow -= Min;
edge[i^1].flow +=Min;
cost += edge[i].cost*Min;
}
flow += Min;
}
//printf("++++ %d %d \n", flow, tol);
return flow;
} int n, m; int main() {
int a, b;
cin >> n >> m;
init(n+m+2);
for(int i = 1; i <= n; i++){
scanf("%d%d", &a, &b);
addedge(0, i, 1, 0);
addedge(i, n+a, 1, 0);
addedge(i, n+b, 1, 0);
}
for(int i = n+1; i <= n+m; i++){
for(int j = 1; j <= 99; j += 2){
addedge(i, n+m+1, 1, j);
}
}
int ans;
MCMF(0, n+m+1, ans);
printf("%d\n", ans);
return 0;
}

题目描述:

弱弱有两个属性aaa和bbb,这两个属性初始的时候均为000,每一天他可以通过努力,让aaa涨111点或bbb涨111点。

为了激励弱弱努力学习,我们共有nnn种奖励,第i种奖励有xix\_ixi​,yiy\_iyi​,ziz\_izi​三种属性,若a≥xia\ge x\_ia≥xi​且b≥yib\ge y\_ib≥yi​,则弱弱在接下来的每一天都可以得到ziz\_izi​的分数。

问m天以后弱弱最多能得到多少分数。

输入:

第一行一个两个整数nnn和mmm(1≤n≤10001\le n\le 10001≤n≤1000,1≤m≤20000000001\le m\le 20000000001≤m≤2000000000)。

接下来nnn行,每行三个整数

xix\_ixi​,yiy\_iyi​,ziz\_izi​(1≤xi,yi≤10000000001\le x\_i,y\_i\le 10000000001≤xi​,yi​≤1000000000,1≤zi≤10000001\le z\_i \le 10000001≤zi​≤1000000)。

输出:

一行一个整数表示答案。

样例输入
2 4
2 1 10
1 2 20
样例输出
50

题意 :有两个属性 a 和 b , 初始值均为 0 ,在每一天你可以让 a 或 b 的值去加 1 ,当你到达某一个临界点时,会得到一些分数,问 m 天后最多能得到多少分?

思路分析 :

  若天数 m 最大是1000,一个比较好想的 dp 就是 dp[ i ][ j ] 表示 a 属性增加到 i 点, b 属性增加到 j 点的最大得分

  那么 dp[i][j] = max(dp[i-1][j]+v[i][j], dp[i][j-1]+v[i][j]) , v[i][j] 表示 a 属性到达 i , b 属性到 j 后每天的得分, 预处理一下即可

  (i, j) 此项得分确实有 则 v[i][j] = v[i-1][j]+v[i][j-1]-v[i-1][j-1]+z[i][j] , 否则 v[i][j] = v[i-1][j]+v[i][j-1]-v[i-1][j-1] ;

    

  但是此题的 天数 m 给了很大的,上面形式的dp 是行不通的,但是观察一下数据范围 a 属性和 b 属性的种类确实最多有 1000, 因此我们这里换种形式 dp

  定义dp[i][j] 表示 a 属性到达第 i 个, b属性到达第 j 个的最大得分 , v[i][j] 也是类似的定义 

代码示例:

using namespace std;
#define ll long long
const ll maxn = 1e6+5;
const ll mod = 1e9+7;
const double eps = 1e-9;
const double pi = acos(-1.0);
const ll inf = 0x3f3f3f3f;
typedef pair<ll, ll> P; ll n, m;
ll xx[1005], yy[1005];
ll v[1005][1005], dp[1005][1005];
map<P, ll>mp;
set<ll>s1, s2; int main() {
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
cin >> n >> m;
ll xi = 1, yj = 1;
ll x, y, z; for(ll i = 1; i <= n; i++){
scanf("%lld%lld%lld", &x, &y, &z);
if (mp.count(P(x, y)) == 0) mp[P(x, y)] = z;
else mp[P(x, y)] += z; if (s1.count(x) == 0) {s1.insert(x); xx[xi++] = x;}
if (s2.count(y) == 0) {s2.insert(y); yy[yj++] = y;}
} sort(xx+1, xx+xi);
sort(yy+1, yy+yj);
for(ll i = 1; i < xi; i++){
for(ll j = 1; j < yj; j++){
if (mp.count(P(xx[i], yy[j]))) v[i][j] = v[i-1][j]+v[i][j-1]-v[i-1][j-1]+mp[P(xx[i],yy[j])];
else v[i][j] = v[i-1][j]+v[i][j-1]-v[i-1][j-1];
//prllf("---- %d %d %d %d %d\n", i, j, v[i][j], x[i], y[j]);
}
} for(ll i = 1; i < xi; i++){
for(ll j = 1; j <yj; j++){
ll x1 = dp[i-1][j]+(xx[i]-xx[i-1]-1)*v[i-1][j]+v[i][j];
ll x2 = dp[i][j-1]+(yy[j]-yy[j-1]-1)*v[i][j-1]+v[i][j];
dp[i][j] = max(x1, x2);
//prllf("++++ %d %d %d \n", i, j, dp[i][j]);
}
} ll ans = 0;
for(ll i = 1; i < xi; i++){
for(ll j = 1; j < yj; j++){
ll res = dp[i][j] + (m-xx[i]-yy[j])*v[i][j];
ans = max(ans, res);
}
}
printf("%lld\n", ans); return 0;
}

wannafly camp day1的更多相关文章

  1. Codeforces 1167c(ccpc wannafly camp day1) News Distribution 并查集模板

    题目: In some social network, there are nn users communicating with each other in mm groups of friends ...

  2. 2020 CCPC Wannafly Winter Camp Day1 C. 染色图

    2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...

  3. 2020 wannafly camp 补题 day1

    题目可以从牛客上找到. 最简单的一个题应该是B B. 密码学 这个应该就是倒着推,题目给了你加密的顺序,所以我们逆推这个就可以得到每一次加密前的字符串. 1H. 最大公约数 题目大意就是给你一个范围1 ...

  4. 2020 CCPC Wannafly Winter Camp Day1 Div.1&amp F

    #include<bits/stdc++.h> #define forn(i, n) for (int i = 0; i < int(n); i++) #define fore(i, ...

  5. 2020 CCPC Wannafly Winter Camp Day1 - I. K小数查询(分块)

    题目链接:K小数查询 题意:给你一个长度为$n$序列$A$,有$m$个操作,操作分为两种: 输入$x,y,c$,表示对$i\in[x,y] $,令$A_{i}=min(A_{i},c)$ 输入$x,y ...

  6. CCPC-Wannafly Winter Camp Day1 (Div2 ABCFJ) 待补...

    Day1 Div2 场外链接 按题目顺序~ A 机器人 传送门 题意:有两条平行直线A.B,每条直线上有n个点,编号为1~n.在同一直线上,从a站点到b站点耗时为两点间的距离.存在m个特殊站点,只有在 ...

  7. CCPC-Wannafly Winter Camp Day1部分题目解析

    Preface 最近恰好不知道做什么题,所以就按老叶要求做上面的比赛. 稍微看了下感觉难度适中,大部分题目偏向联赛难度,当然也有些题目打到了省选题的感觉(基本都是Div1的题) 这里就简单拿一些我做得 ...

  8. CCPC-Wannafly Winter Camp Day1 (Div2, onsite) A B C E F I J

    A 机器人 链接:https://www.cometoj.com/contest/7/problem/A?problem_id=92 思路: 分两大类讨论: 1. B区没有点: (1)点都在起点左边 ...

  9. 牛客国庆训练,CCPC Camp DAY1 J 倍增,括号匹配

    https://www.nowcoder.com/acm/contest/201#question 题意:中文不翻译了 解法的个人理解: 对于一个合法的区间$[L,R]$ 1.显然其左括号的匹配位置都 ...

随机推荐

  1. 判断当前所使用python的版本和来源

    import sys print(sys.prefix) print(sys.executable) 怎样判断当前py文件在什么版本的python环境下运行 import sys print(sys. ...

  2. java TCP传输

    两个端点的建立连接后会有一个传输数据的通道,这通道称为流,而且是建立在网络基础上的流,称之为socket流.该流中既有读取,也有写入. tcp的两个端点:一个是客户端,一个是服务端. 客户端:对应的对 ...

  3. 11-28-----vertor和list使用场景

    1.vector拥有一段连续的内存空间,因此支持随机访问,如果需要高效的随机访问,而不子啊胡插入和删除的效率,使用vector, 2.list拥有一段不连续的内存空间,如果需要高效的插入和删除,而不关 ...

  4. Mockito -- 入门篇

    Mockito是一种mock工具/框架.我理解EasyMock有点过时了,Mockito是现在比较流行的. 什么是mock?说的直白一点,大家都知道unit test应该是尽可能独立的.对一个clas ...

  5. js 实用技巧 短路求值

    &&运算符  如果操作有false  则返回false  例如 0&&1  // 返回0 true&&false  //返回false 0&&a ...

  6. 为何D3D11的几个矩阵需要转置?

    在学习D3D11的时候遇到一个问题,事情是这样的: D3D11引入了常量缓存(const buffer)用来实现数据的高速传输,这块儿buffer是CPU Only Write,GPU Only Re ...

  7. KETTLE4个工作中有用的复杂实例--1、数据定时自动(自动抽取)同步作业

    今天呕心沥血花了8个小时给大家带来kettle工作中最常见的四种复杂实例,90%的项目用到这4种实例都可以解决. 4种实例种还有2种通用kettle工具,使用这两种通用工具实例,可以直接修改相应的配置 ...

  8. HDU4609 FFT+组合计数

    HDU4609 FFT+组合计数 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意: 找出n根木棍中取出三根木棍可以组成三角形的概率 题解: ...

  9. redis分布式锁使用方法

    引用: StackExchange.Redis.dll Redlock.CSharp.dll RedLock.dll 代码: public class RedlockHelper { public v ...

  10. Elasticsearch慢查询故障诊断

    最近在做ES搜索调优,看了一些lucene搜索的文档和代码,本文用于总结调优过程中学到的知识和自己的思考. 在抓到ES慢查询之后,会通过profile或者kibana的Search Profiler ...