链接: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. React实战一

    目录 1. 搭建环境 2. React知识点 1. 组件 1.1 定义一个组件 1.2 组合与拆分组件 1.3 组件传值 1.4 state 1.5 生命周期函数 1.6 无状态组件 1.7 List ...

  2. JavaWeb总结(十五)

    AJAX(Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)) AJAX的作用是什么? 在无需重新加载整个网页的情况下,能够更新部分网页的技术 ...

  3. c++ 自定义类型,函数指针类型

    用typedef定义函数指针类型 -函数指针和函数指针数组 46课里边有如下代码 int add(int a,int b,int d) { return a+b+d; } int mul(int a, ...

  4. P5231 [JSOI2012]玄武密码

    P5231 [JSOI2012]玄武密码 链接 分析: 首先对所有询问串建立AC自动机,然后扫描一遍母串,在AC自动机上走,没走到一个点,标记这个点走过了,并且它的fail树上的祖先节点也可以访问到( ...

  5. Java Swing:JPanel中添加JPanel

    1. JPanel默认布局是FlowLayout,如果不设置父JPanel的布局,则子JPanel自动填满父JPanel. JPanel jpanel = new JPanel(); jpanel.s ...

  6. java异常处理 日志记录异常具体位置的方法

    首先要在方法处抛出 Exception异常 然后在方法调用处try catch接收此异常对象 这样就能够记录异常具体位置了 控制台输出: 日志: 要点: System.getProperty(&quo ...

  7. MYSQL之视图、触发器、事务

    一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...

  8. python之GIL(Global Interpreter Lock)

    一 介绍 ''' 定义: In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple nati ...

  9. 【JUC源码解析】Phaser

    简介 Phaser,阶段器,可作为一个可复用的同步屏障,与CyclicBarrier和CountDownLatch类似,但更强大. 全览图 如上图所示,phaser,支持phaser树(图中,简化为p ...

  10. 【linux报错】安装好虚拟机后,挂载光盘报错:mount:you must specify the filesystem type

    问题现象: 问题原因: 当时光盘的“已连接”的勾没有勾上 解决后: