题目描述:

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

正如往常一样,宇扬在蛋糕上插了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. 京东基于Spark的风控系统架构实践和技术细节

    京东基于Spark的风控系统架构实践和技术细节 时间 2016-06-02 09:36:32  炼数成金 原文  http://www.dataguru.cn/article-9419-1.html ...

  2. 154th LeetCode Weekly Contest

    A B D均比较简单.先说C题 K-Concatenation Maximum Sum Given an integer array arr and an integer k, modify the ...

  3. 【踩坑记录】vue单个组件内<style lang="stylus" type="text/stylus" scoped>部分渲染失效

    vue组件化应用,近期写的单个组件里有一个的渲染部分样式渲染不上去 因为同结构的其他组件均没有问题,所以排除是.vue文件结构的问题,应该是<style>内部的问题 <style l ...

  4. 性能测试基础-SOCKET协议用例

    1.首先在进行性能测试的时候,我们要了解软件的通信协议是什么,我们使用什么协议,如何去模拟.SOCKET协议主要应用于在C/S模式的系统. 作者本人已当初做过的C/S架构的系统做的脚本录制,在上面做脚 ...

  5. jQuery 工具类函数-URL操作函数

    调用名为$. param的工具函数,能使对象或数组按照key/value格式进行序列化编码,该编码后的值常用于向服务端发送URL请求,调用格式为: $. param (obj); 参数obj表示需要进 ...

  6. 关于electron中入口文件main.js一些重要参数(持续更新maybe)

    const {app, BrowserWindow} = require('electron') const path = require('path') let mainWindow functio ...

  7. CF1151div2(Round 553)

    CF1151div2(Round 553) 思路题大赛 A 少考虑了一种情况,到死没想到 B 貌似我随机化50000次,没找到就无解貌似也过了 感觉随随便便乱搞+分类讨论都可以过的样子 #includ ...

  8. boostrap-非常好用但是容易让人忽略的地方【4】:Font Awesome

    font-awesome基本用法 官方代码传送门 font-awesome在bootstrap中的特殊用法(这个才是重点) 要点归纳1(官方) 官方代码传送门 要点归纳2(我的) <a href ...

  9. Python3_函数参数传递、可变与不可变对象、变量作用域、函数返回值

    参数传递: 在 python 中,类型属于对象,变量是没有类型的:(变量都仅仅是一个对象的引用,没有类型之分)a=[1,2,3] a="Runoob" 以上代码中,[1,2,3] ...

  10. Struts2注解详解(转)

    一,引入支持Struts2支持注解开发jar包: struts2-convention-plugin-2.1.8.1.jar(支持Struts2框架注解开发的jar包) 二,Struts2使用注解开发 ...