链接:https://www.nowcoder.com/acm/contest/206/A
来源:牛客网

Birthday

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 1048576K,其他语言2097152K
64bit IO Format: %lld

题目描述

恬恬的生日临近了。宇扬给她准备了一个蛋糕。
正如往常一样,宇扬在蛋糕上插了n支蜡烛,并把蛋糕分为m个区域。因为某种原因,他必须把第i根蜡烛插在第ai个区域或第bi个区域。区域之间是不相交的。宇扬在一个区域内同时摆放x支蜡烛就要花费x2的时间。宇扬布置蛋糕所用的总时间是他在每个区域花的时间的和。
宇扬想快些见到恬恬,你能告诉他布置蛋糕最少需要多少时间吗?

输入描述:

第一行包含两个整数n,m(1 ≤ n ≤ 50, 2≤ m≤ 50)。
接下来n行,每行两个整数a

i

,b

i

(1 ≤ a

i

, b

i

 ≤ m)。

输出描述:

一个整数表示答案。
示例1

输入

复制

3 3
1 2
1 2
1 2

输出

复制

5
示例2

输入

复制

3 3
1 2
2 3
1 3

输出

复制

3
思路:最小费用最大流。
代码:
 #include <cstdio>
#include <cstring>
#include <vector>
#include <queue> using namespace std; const int INF = 0x3f3f3f3f;
const int MAXN = ; struct Edge{
int value,flow,to,rev;
Edge(){}
Edge(int a,int b,int c,int d):to(a),value(b),flow(c),rev(d){}
}; vector<Edge> E[MAXN]; inline void Add(int from,int to,int flow,int value){
E[from].push_back(Edge(to,value,flow,E[to].size()));
E[to].push_back(Edge(from,-value,,E[from].size()-));
} bool book[MAXN];//用于SPFA中标记是否在queue中
int cost[MAXN];//存费用的最短路径
int pre[MAXN];//存前节点
int pree[MAXN];//存在前节点的vector中的下标 bool Spfa(int from,int to){
memset(book,false,sizeof book);
memset(cost,INF,sizeof cost);
book[from] = true;
cost[from] = ;
queue<int> Q;
Q.push(from);
while(!Q.empty()){
int t = Q.front();
book[t] = false;
Q.pop();
for(int i= ; i<E[t].size() ; ++i){
Edge& e = E[t][i];
if(e.flow > && cost[e.to] > cost[t] + e.value){
cost[e.to] = cost[t] + e.value;
pre[e.to] = t;
pree[e.to] = i;
if(book[e.to] == false){
Q.push(e.to);
book[e.to] = true;
}
}
}
}
return cost[to] != INF;
} int Work(int from,int to){
int sum = ;
while(Spfa(from,to)){
int mflow = INF;//SPFA找到的最短路径的最小容量
int flag = to;
while(flag != from){
mflow = min(mflow,E[pre[flag]][pree[flag]].flow);
flag = pre[flag];
}
flag = to;
while(flag != from){
sum += E[pre[flag]][pree[flag]].value * mflow;
E[pre[flag]][pree[flag]].flow -= mflow;
E[flag][E[pre[flag]][pree[flag]].rev].flow += mflow;
flag = pre[flag];
}
}
return sum;
} int main(){ int N,M;
while(scanf("%d %d",&N,&M) == ){
int a,b;
for(int i= ; i<=N ; ++i){
scanf("%d %d",&a,&b);
Add(i,a+N,,);
Add(i,b+N,,);
Add(,i,,);
}
for(int i= ; i<=M ; ++i){
for(int j= ; j<= ; j+=){//99 = 2*50-1;
Add(i+N,M+N+,,j);
}
}
printf("%d\n",Work(,M+N+));
for(int i= ; i<=M+N+ ; ++i)E[i].clear();
} return ;
}

链接:https://www.nowcoder.com/acm/contest/206/B
来源:牛客网

Board

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 1048576K,其他语言2097152K
64bit IO Format: %lld

题目描述

恬恬有一个nx n的数组。她在用这个数组玩游戏:
开始时,数组中每一个元素都是0。
恬恬会做某些操作。在一次操作中,她可以将某一行的所有元素同时加上一个值,也可以将某一列的所有元素同时加上一个值。
在几次操作后,一个元素被隐藏了。你能帮助她回忆隐藏的数是几吗?

输入描述:

第一行一个整数n(1≤ n≤ 1000)。
接下来n行每行n个整数表示数组a。
第(i+1)行的第j个元素表示a

ij

(a

ij

=-1或0≤ a

ij

 ≤ 10000)。-1表示隐藏的元素。

输出

仅一个整数表示答案。
示例1

输入

复制

3
1 2 1
0 -1 0
0 1 0

输出

复制

1

思路:先把每一行先减去每一行的最小值,然后找到“-1”所在的行和列(行和列的各自的最小值的和即为所求)
代码:
 #include<bits/stdc++.h>
using namespace std;
const int inf=1e9+;
int a[][];
int main()
{
int n;
int x,y;
scanf("%d",&n);
for(int i=; i<=n; i++)
{
for(int j=; j<=n; j++)
{
scanf("%d",&a[i][j]);
if(a[i][j]==-)
{
x=i,y=j;
} }
}
int sum;
for(int i=; i<=n; i++)
{
sum==inf;
if(i==x)
continue;
for(int j=;j<=n;j++)
{
sum=min(sum,a[i][j]);
}
for(int j=;j<=n;j++)
{
a[i][j]-=sum;
}
}
for(int i=; i<=n; i++)
{
sum==inf;
if(i==y)
continue;
for(int j=;j<=n;j++)
{
sum=min(sum,a[j][i]);
}
for(int j=;j<=n;j++)
{
a[j][i]-=sum;
}
}
int tmp1=inf,tmp2=inf;
for(int i=;i<=n;i++)
{
if(i==x)
{
continue;
}
tmp1=min(tmp1,a[i][y]);
}
for(int i=;i<=n;i++)
{
if(i==y)
{
continue;
}
tmp2=min(tmp2,a[x][i]);
}
printf("%d\n",tmp1+tmp2);
return ;
}

链接:https://www.nowcoder.com/acm/contest/206/C
来源:牛客网

Circle

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 1048576K,其他语言2097152K
64bit IO Format: %lld

题目描述

现在我们要把这n个数字首尾连接组成一个环,使得相邻元素互质的对数尽可能多。请输出最大对数。

输入描述:

一行一个整数n(1≤ n≤ 1000)。

输出描述:

一行一个整数表示答案。
示例1

输入

复制

4

输出

复制

4

说明

样例的一种构造方法为1 4 3 2。

思路:输入n,输出n,此时的排序方式为1,n,n-1,n-2,n-3,,,,,5,4,3,2

代码:
 #include<bits/stdc++.h>
using namespace std; int main()
{
int n;
scanf("%d",&n);
printf("%d\n",n);
return ;
}
链接:https://www.nowcoder.com/acm/contest/206/H
来源:牛客网

Mountain

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 1048576K,其他语言2097152K
64bit IO Format: %lld

题目描述

平面上有n座山,每座山都有左右两面,第i座山的高度为ai,现在弱弱在第一座山的左边山脚下(高度为0),他想要依此爬过这些山,到达第n座山的右边山脚下。
除了简单的爬上爬下,还有一种特殊操作。
如果弱弱目前在第i座山右面的海拔x的位置,且第j ( i < j )座山的海拔大于等于x,且第座山中没有一座山的海拔高于x,那么他可以使用绳索滑到第j座山左面海拔x的位置。
弱弱想找到一种方式,使得他在行程中海拔变化的幅度最小。请输出最小幅度。

输入描述:

第一行一个整数n(1≤ n≤ 1000)。
接下来一行n个整数a

i

(1≤ a

i

≤ 1000)表示每座山的高度。

输出描述:

一行一个整数表示答案。
示例1

输入

复制

5
1 3 5 4 2

输出

复制

10
思路:最高点的两倍。
代码:
 #include<bits/stdc++.h>
using namespace std;
int a[];
int main()
{
int n;
scanf("%d",&n);
for(int i=;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n);
printf("%d\n",*a[n-]);
return ;
}
链接:https://www.nowcoder.com/acm/contest/206/E
来源:牛客网

Growth

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 1048576K,其他语言2097152K
64bit IO Format: %lld

题目描述

弱弱有两个属性a和b,这两个属性初始的时候均为0,每一天他可以通过努力,让a涨1点或b涨1点。
为了激励弱弱努力学习,我们共有n种奖励,第i种奖励有xi,yi,zi三种属性,若a≥ xi且b≥ yi,则弱弱在接下来的每一天都可以得到zi的分数。
问m天以后弱弱最多能得到多少分数。

输入描述:

第一行一个两个整数n和m(1≤ n≤ 1000,1≤ m≤ 2000000000)。
接下来n行,每行三个整数x

i

,y

i

,z

i

(1≤ x

i

,y

i

≤ 1000000000,1≤ z

i

 ≤ 1000000)。

输出描述:

一行一个整数表示答案。
示例1

输入

复制

2 4
2 1 10
1 2 20

输出

复制

50

备注:

在样例中,弱弱可以这样规划:第一天a涨1,第二天b涨1,第三天b涨1,第四天a涨1。
共获得0+0+20+30=50分。 思路:离散+DP
代码:
 #include <bits/stdc++.h>
using namespace std; typedef long long ll;
const int maxn = 1e3 + ; map<pair<int, int>, int> p;
set<int> sx, sy;
int x[maxn], y[maxn];
ll dp[maxn][maxn], v[maxn][maxn]; int main()
{
int n, m;
int cnt1 = , cnt2 = ;
scanf("%d %d", &n, &m);
for(int i = ; i < n; i++) {
int tx, ty, tz;
scanf("%d %d %d", &tx, &ty, &tz);
p[pair<int, int>(tx, ty)] += tz;
if(!sx.count(tx)) sx.insert(tx), x[cnt1++] = tx;
if(!sy.count(ty)) sy.insert(ty), y[cnt2++] = ty;
} sort(x + , x + cnt1);
sort(y + , y + cnt2); for(int i = ; i < cnt1; i++) {
for(int j = ; j < cnt2; j++) {
if(!p[pair<int, int>(x[i], y[j])]) v[i][j] = v[i - ][j] + v[i][j - ] - v[i - ][j - ];
else v[i][j] = v[i - ][j] + v[i][j - ] - v[i - ][j - ] + p[pair<int, int>(x[i], y[j])];
}
} for(int i = ; i < cnt1; i++) {
for(int j = ; j < cnt2; j++) {
dp[i + ][j] = max(dp[i + ][j], dp[i][j] + (x[i + ] - x[i] - ) * v[i][j] + v[i + ][j]);
dp[i][j + ] = max(dp[i][j + ], dp[i][j] + (y[j + ] - y[j] - ) * v[i][j] + v[i][j + ]);
}
} ll ans = ;
for(int i = ; i < cnt1; i++) {
for(int j = ; j < cnt2; j++) {
ll t = dp[i][j] + (m - x[i] - y[j]) * v[i][j];
ans = max(ans, t);
}
}
printf("%lld\n", ans);
}

参考博客:https://blog.csdn.net/deerly_/article/details/81584521


 
 

牛客网国庆集训派对Day6 题目 2018年的更多相关文章

  1. 牛客网国庆集训派对Day5 题目 2018年

    链接:https://www.nowcoder.com/acm/contest/205/L来源:牛客网参考博客:https://blog.csdn.net/HTallperson/article/de ...

  2. 牛客网国庆集训派对Day4题目 2018年

    链接:https://www.nowcoder.com/acm/contest/204/A来源:牛客网 深度学习 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他 ...

  3. 牛客网国庆集训派对Day3题目 2018年

    链接:https://www.nowcoder.com/acm/contest/203/D来源:牛客网 Shopping 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K ...

  4. 牛客国庆集训派对Day6 A Birthday 费用流

    牛客国庆集训派对Day6 A Birthday:https://www.nowcoder.com/acm/contest/206/A 题意: 恬恬的生日临近了.宇扬给她准备了一个蛋糕. 正如往常一样, ...

  5. 牛客国庆集训派对Day6 && CCPC-WannaFly-Camp #1 F. kingdom(DP)

    题目链接:https://www.nowcoder.com/acm/contest/206/F 题意:一棵 n 个点的树,根为 1,重儿子到父亲的费用为 0,其余为 1,问所有点到 1 的最大总费用是 ...

  6. 牛客国庆集训派对Day6 B.Board

    链接 [https://www.nowcoder.com/acm/contest/206/B] 分析 只要在n*n范围内随便找一个斜对角的一个格子去计算就知道了 具体看代码体会吧 代码 #includ ...

  7. 牛客国庆集训派对Day6 Solution

    A    Birthday 思路:设置一个源点,一个汇点,每次对$源点对a_i, b_i , a_i 对 b_i 连一条流为1,费用为0的边$ 每个点都再连一条 1, 3, 5, 7, ....的边到 ...

  8. 减2或减3(很搞的贪心)2019牛客国庆集训派对day6

    题意:https://ac.nowcoder.com/acm/contest/1111/D 问你先减二x次的情况下,最少减几次3. 思路: %3不为0的要先减2,然后%3为0的要先减大的(比如9 3 ...

  9. MySQL基础练习---牛客网的数据以及典型题目

    1 部门表departments 部门no和部门名称 2 部门员工表 dept_emp 每个部门对应的员工信息 3 部门经理表 dept_manager 每个部门的经理信息 4 员工表 employe ...

随机推荐

  1. SVG动画总结

    SVG可以在内部定义CSS动画样式,包括动画,如下面的格式: <svg> <defs> <style> </style> </defs>&l ...

  2. 【转】Autofac高级用法之动态代理

    原文:http://www.cnblogs.com/stulzq/p/8547839.html 前言 Autofac的DynamicProxy来自老牌的Castle项目.DynamicProxy(以下 ...

  3. 20155308 加分题-mybash的实现(第五周)

    20155308 加分题-mybash的实现(第五周) 实验要求 使用fork,exec,wait实现mybash 写出伪代码,产品代码和测试代码 发表知识理解,实现过程和问题解决的博客(包含代码托管 ...

  4. 2017-2018-1 20155313 《信息安全系统设计基础》 Myod

    2017-2018-1 20155313 <信息安全系统设计基础> Myod Myod要求 1.复习c文件处理内容 2.编写myod.c 用myod XXX实现Linux下od -tx - ...

  5. 27-ATM+购物车程序

    1.需求 本章作业: 模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 支持多账户登录 支持账户间转账 记录每 ...

  6. linux提权 searchsploit 使用规范

    使用 searchsploit 时,要把整个控制台最大化,这样才能显示完整的漏洞信息. 查看漏洞帮助文件:

  7. CSS盒模型 flex

    用于网页布局,PC的话,兼容性不够,慎用,手机端的话,神器 整理部分通用的,可以直接复制的,省得下次再写一遍 注意,设为 Flex 布局以后,子元素的float.clear和vertical-alig ...

  8. MYSQL 数据库结构优化

    数据库结构优化 优化数据大小 使表占用尽量少的磁盘空间.减少磁盘I/O次数及读取数据量是提升性能的基础原则.表越小,数据读写处理时则需要更少的内存,同时,小表的索引占用也相对小,索引处理也更加快速. ...

  9. beego跨域请求配置

    不说废话 在main函数前加入如下代码 func init() { //跨域设置 var FilterGateWay = func(ctx *context.Context) {ctx.Respons ...

  10. Java字符串分割

    java中字符串的分割函数,split("你想要分割的字符", 你想要最多分割为多少段,正整数) 注意事项: 1.分割特殊字符考虑转义字符的使用.如: . \ | 2.第二个参数: ...