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

题目描述

现在有一棵被Samsara-Karma染了k种颜色的树,每种颜色有着不同的价值
Applese觉得Samsara-Karma染的太难看了,于是打算把整棵树重新染成同一种颜色
但是,由于一些奥妙重重的原因,每一次染色Applese可以选择两个有边相连的点,将其中一个染成另一个的颜色。而进行一次这样的操作需要付出两种颜色价值和的代价
现在,Applese的钱要用来买书(game),所以他想要最小化代价

输入描述:

输入包括若干行
第一行包括一个数n,表示这棵树有n个节点
第二行包括n个数,第i个数表示第i个节点的颜色col

i

**注意:一个颜色的标号即价值
接下来的n - 1行,每行包括两个数u, v,表示u节点与v节点之间有一条无向边
n ≤ 100000, 1 ≤ coli ≤ 1e9,数据保证是一棵树

输出描述:

输出包括一行
第一行包括一个数,表示最小代价

输入例子:
4
2 3 4 3
1 2
2 3
3 4
输出例子:
12

-->

示例1

输入

复制

4
2 3 4 3
1 2
2 3
3 4

输出

复制

12
边的输入根本就是多余的,直接枚举所有颜色统计最小的值即可。
  
 #include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f3f3f3f
int col[];
map<int,int>M;
int main(){
int n,m,i,j,k;
while(cin>>n){ll u,v,tot=,all=;
M.clear();
for(i=;i<=n;++i) {
scanf("%d",col+i);
all+=col[i];
M[col[i]]++;
}
for(i=;i<n;++i){
scanf("%d%d",&u,&v);
}
ll ans=inf;
for(i=;i<=n;++i){
ll tt=M[col[i]];
ans=min(ans,((ll)n-tt)*col[i]+all-tt*col[i]);
}
cout<<ans<<endl;
}
return ;
}
B-链接:https://www.nowcoder.com/acm/contest/133/B
来源:牛客网

题目描述


Applese有1个容量为v的背包,有n个物品,每一个物品有一个价值ai,以及一个大小bi
然后他对此提出了自己的疑问,如果我不要装的物品装的价值最大,只是一定需要装m个物品,要使得求出来的物品价值的中位数最大
Applese觉得这个题依然太菜,于是他把这个问题丢给了你
当物品数量为偶数时,中位数即中间两个物品的价值的平均值

输入描述:

第一行三个数v, n, m,分别代表背包容量,物品数量以及需要取出的物品数量
接下来n行,每行两个数ai,bi,分别代表物品价值以及大小
n ≤ 1e5, 1 ≤ m ≤ n, ai ≤ 1e9, v ≤ 1e9, bi ≤ v

输出描述:

仅一行,代表最大的中位数

输入例子:
20 5 3
3 5
5 6
8 7
10 6
15 10
输出例子:
8

-->

示例1

输入

复制

20 5 3
3 5
5 6
8 7
10 6
15 10

输出

复制

8
非常操蛋,因为我把m打成了n,把first打成了second导致debug了一天,浪费很久的时间= =
做法并不难想,将物品分成前,中,后三个部分且每一部分的长度都知道,然后预处理下前/后最小的体积值,
枚举中间的1/2个点,对于奇数长度,直接枚举中点。偶数长度,枚举第一个点,二分查找右边一个的点(之所以能二分是因为first递增
而且rs[]也是递增的),在满足总的体积不超v的情况下使得价值尽可能的大,也就等价于尽可能的找右边的点。
 #include<bits/stdc++.h>
using namespace std;
#define LL long long
#define pii pair<LL,LL> pii x[];
LL ls[],rs[];
priority_queue<LL>q;
priority_queue<LL>q2; void init(int n,int m){ int ll=(m-)/,rr=(m-)/;
LL sum=;
for(int i=;i<=ll;++i){
q.push(x[i].second);
sum+=x[i].second;
}
ls[ll]=sum;
for(int i=+ll;i<=n;++i){
if(q.empty()) continue;
if(/*!q.empty()&&*/q.top()>x[i].second){
sum=sum-q.top()+x[i].second;
q.pop();
q.push(x[i].second);
}
ls[i]=sum;
} sum=;
for(int i=n;i>n-rr;--i){
q2.push(x[i].second);
sum+=x[i].second;
}
rs[n-rr+]=sum;
for(int i=n-rr;i>=;--i){
if(!q2.empty()&&q2.top()>x[i].second){
sum=sum-q2.top()+x[i].second;
q2.pop();
q2.push(x[i].second);
}
rs[i]=sum;
}
}
int main(){
int n,m,i,j,k;
LL v;
cin>>v>>n>>m;
for(i=;i<=n;++i) scanf("%lld%lld",&x[i].first,&x[i].second);
sort(x+,x++n);
init(n,m);
int ll=(m-)/,rr=(m-)/;
if(m%){
LL ans=;
for(i=n-rr;i>ll;--i){
if(ls[i-]+rs[i+]+x[i].second<=v)
{ans=x[i].first;break;}
}
cout<<ans<<endl;
}
else{
LL ans=;
for(i=ll+;i<n-rr;++i){
int L=i+,R=n;
LL tmp=v-ls[i-]-x[i].second;
while(L<R){
int mid=R-((R-L)>>);
if(n-(mid+)+>=rr&&x[mid].second+rs[mid+]<=tmp) L=mid;
else R=mid-;
}
if(tmp-x[L].second-rs[L+]>=&&n-(L+)+>=rr)
ans=max(ans,x[i].first+x[L].first);
}
cout<<ans/<<endl;
} return ;
}
 

Wannafly挑战赛20-A,B的更多相关文章

  1. 染色 Wannafly挑战赛20 A 思维

    链接:https://www.nowcoder.com/acm/contest/133/A来源:牛客网 现在有一棵被Samsara-Karma染了k种颜色的树,每种颜色有着不同的价值 Applese觉 ...

  2. nowcoder牛客wannafly挑战赛20

    A---染色 签到题,设最终颜色为x,一次操作就需要把一个不是x的点变为x,所以最终颜色为x时需要操作 总结点个数-颜色为x的节点个数,然后枚举所有颜色就行了 #include <iostrea ...

  3. Wannafly 挑战赛 19 参考题解

    这一次的 Wannafly 挑战赛题目是我出的,除了第一题,剩余的题目好像对大部分算法竞赛者来说好像都不是特别友好,但是个人感觉题目质量还是过得去的,下面是题目链接以及题解. [题目链接] Wanna ...

  4. 【Wannafly挑战赛4】F 线路规划 倍增+Kruskal+归并

    [Wannafly挑战赛4]F 线路规划 题目描述 Q国的监察院是一个神秘的组织.这个组织掌握了整个帝国的地下力量,监察着Q国的每一个人.监察院一共有N个成员,每一个成员都有且仅有1个直接上司,而他只 ...

  5. Wannafly挑战赛25游记

    Wannafly挑战赛25游记 A - 因子 题目大意: 令\(x=n!(n\le10^{12})\),给定一大于\(1\)的正整数\(p(p\le10000)\)求一个\(k\)使得\(p^k|x\ ...

  6. Wannafly挑战赛27

    Wannafly挑战赛27 我打的第一场$Wannafly$是第25场,$T2$竟然出了一个几何题?而且还把我好不容易升上绿的$Rating$又降回了蓝名...之后再不敢打$Wannafly$了. 由 ...

  7. Wannafly挑战赛21A

    题目链接 Wannafly挑战赛21A 题解 代码 #include <cstdio> #include <cmath> #define MAX 1000005 #define ...

  8. Wannafly挑战赛24游记

    Wannafly挑战赛24游记 A - 石子游戏 题目大意: A和B两人玩游戏,总共有\(n(n\le10^4)\)堆石子,轮流进行一些操作,不能进行下去的人则输掉这局游戏.操作包含以下两种: 把石子 ...

  9. Wannafly挑战赛25C 期望操作数

    Wannafly挑战赛25C 期望操作数 简单题啦 \(f[i]=\frac{\sum_{j<=i}f[j]}{i}+1\) \(f[i]=\frac{f[i]}{i}+\frac{\sum_{ ...

  10. Wannafly挑战赛18B 随机数

    Wannafly挑战赛18B 随机数 设\(f_i\)表示生成\(i\)个数有奇数个1的概率. 那么显而易见的递推式:\(f_i=p(1-f_{i-1})+(1-p)f_{i-1}=(1-2p)f_{ ...

随机推荐

  1. MySQL数据库----安装

    一.基础部分 1.数据库是什么 之前所学,数据要永久保存,比如用户注册的用户信息,都是保存于文件中,而文件只能存在于某一台机器上. 如果我们不考虑从文件中读取数据的效率问题,并且假设我们的程序所有的组 ...

  2. 01: vue.js安装

    1.1 vue.js安装与基本使用 官网:https://cn.vuejs.org/ 1.使用之前,我们先来掌握3个东西是用来干什么的 1. npm: Nodejs下的包管理器. 2. webpack ...

  3. 08: CORS实现跨域请求

    目录: 1.1 cors跨域请求介绍 1.2 使用tornado实现 复杂请求 1.3 Django中使用django-cors-headers解决跨域问题 1.1 cors跨域请求介绍返回顶部 1. ...

  4. 20145104张家明 《Java程序设计》第8周学习总结

    20145104张家明 <Java程序设计>第8周学习总结 教材学习内容总结 第15章 -java.util.logging包提供了日志功能相关类与接口,不必额外配置日志组件,就可以在标准 ...

  5. cygwin下使用apt-cyg安装新软件

    1.获取  (记得先安装好git) git clone https://github.com/transcode-open/apt-cyg.git 2.安装apt-cyg cd apt-cyg chm ...

  6. hdu 1671 Phone List(字典树)题解

    题意:给一连串数字,如果有前缀重复给出NO,否则给出YES 思路:这道题要delete否则爆内存,之前想的直接在insert()里解决查询有错误,所以先保存数据再查询. 代码: #include< ...

  7. POJ 3687 Labeling Balls(拓扑排序)题解

    Description Windy has N balls of distinct weights from 1 unit to N units. Now he tries to label them ...

  8. @SuppressWarings注解的作用和用法

    一.前言 编码时我们总会发现如下变量未被使用的警告提示: 上述代码编译通过且可以运行,但每行前面的“感叹号”就严重阻碍了我们判断该行是否设置的断点了.这时我们可以在方法前添加 @SuppressWar ...

  9. js中可以直接使用id而不用获取id

    先来看一个例子: 不获取 id 也可以使用 id 元素. <!-- Author: XiaoWen Create a file: 2017-01-11 13:58:01 Last modifie ...

  10. 读jQuery源码有感

    读之前的预备工作: 1.基础的js知识,以及html和css知识,和正则表达式知识.可以参考妙味课堂的基础js,html和css大纲. 2.JavaScript核心指南的知识http://www.cn ...