Divide and conquer:Moo University - Financial Aid(POJ 2010)
Moo University - Financial Aid
其实是老题了http://www.cnblogs.com/Philip-Tell-Truth/p/4926008.html
这一次我们换二分法来做这一道题,其实二分法比我以前那个方法好想一点,主要是这次我们可以根据下标进行二分,然后排两次序,第一次是根据分数来排序,然后记录分数的序,接下来就把aid排一次序,然后我们就可以进行二分了
参考http://www.hankcs.com/program/cpp/poj-2010-moo-university-financial-aid-binary-search.html
#include <iostream>
#include <algorithm>
#include <functional> using namespace std; struct _set
{
int score, aid, rank_score;
}Cows_Score[], Cows_Aid[];
bool rank_score(_set &a, _set &b)
{
return a.score < b.score;
}
bool aid_score(_set &a, _set &b)
{
return a.aid < b.aid;
} void solve(const int, const int, const int); int main(void)
{
int N, Cows_Sums, F; while (~scanf("%d%d%d", &N, &Cows_Sums, &F))
{
for (int i = ; i < Cows_Sums; i++)
scanf("%d%d", &Cows_Score[i].score, &Cows_Score[i].aid);
sort(Cows_Score, Cows_Score + Cows_Sums, rank_score);
for (int i = ; i < Cows_Sums; i++)
Cows_Score[i].rank_score = i;//给score的号排序,等一下二分的时候要用到
memcpy(Cows_Aid, Cows_Score, sizeof(_set)*Cows_Sums);
sort(Cows_Aid, Cows_Aid + Cows_Sums, aid_score); solve(N, Cows_Sums, F);
}
return ;
} void solve(const int N, const int Cows_Sums, const int F)
{
int lb = , rb = Cows_Sums, mid,left, right, tmp_sum;
bool m, n;
while (rb - lb > )//注意这里是对下标进行二分,对于aid直接找就可以了,注意一些细节上的问题就好
{
mid = (lb + rb) / ;
tmp_sum = Cows_Score[mid].aid;
left = ; right = ;
for (int i = ; i < Cows_Sums; i++)
{
if ((Cows_Aid[i].rank_score < mid) && (tmp_sum + Cows_Aid[i].aid <= F) && left < N / )
{
tmp_sum += Cows_Aid[i].aid;
left++;
}
else if ((Cows_Aid[i].rank_score > mid) && (tmp_sum + Cows_Aid[i].aid <= F) && right < N / )
{
tmp_sum += Cows_Aid[i].aid;
right++;
}
}
m = left < N / ? : ;
n = right < N / ? : ;
if (!m&&!n)
{
printf("-1\n");
return;
}
else if (m == || (m == && n == ))
lb = mid;
else if (n == )
rb = mid; }
printf("%d\n", Cows_Score[lb].score);
}
不过其实速度没差多少,因为都是O(nlogn)的算法
Divide and conquer:Moo University - Financial Aid(POJ 2010)的更多相关文章
- Moo University - Financial Aid POJ 2010 优先队列(最大堆)
题目:http://poj.org/problem?id=2010 题目大意: 奶牛上大学.因为经济问题,每头奶牛都需要一定的补助需求,学校会提供一定的资金用于补助 每头牛都有自己的分数,学校招收的名 ...
- Heap:Moo University - Financial Aid(POJ 2010)
牛的学校 题目大意:这只Bessie真是太顽皮了,她又搞了个学校,准备招生,准备通过一个考试筛选考生,但是不能招到每个学生,每个学生也不能一定能上学,要资助,问你在一定资金内,怎么收学生,使收到 ...
- POJ 2010 Moo University - Financial Aid( 优先队列+二分查找)
POJ 2010 Moo University - Financial Aid 题目大意,从C头申请读书的牛中选出N头,这N头牛的需要的额外学费之和不能超过F,并且要使得这N头牛的中位数最大.若不存在 ...
- poj 2010 Moo University - Financial Aid
Moo Univ ...
- 【POJ - 2010】Moo University - Financial Aid(优先队列)
Moo University - Financial Aid Descriptions 奶牛大学:奶大招生,从C头奶牛中招收N(N为奇数)头.它们分别得分score_i,需要资助学费aid_i.希望新 ...
- poj 2010 Moo University - Financial Aid 最大化中位数 二分搜索 以后需要慢慢体会
Moo University - Financial Aid Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6599 A ...
- Moo University - Financial Aid
Moo University - Financial Aid Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6020 Accep ...
- poj 2010 Moo University - Financial Aid(优先队列(最小堆)+ 贪心 + 枚举)
Description Bessie noted that although humans have many universities they can attend, cows have none ...
- POJ 2010 - Moo University - Financial Aid 初探数据结构 二叉堆
考虑到数据结构短板严重,从计算几何换换口味= = 二叉堆 简介 堆总保持每个节点小于(大于)父亲节点.这样的堆被称作大根堆(小根堆). 顾名思义,大根堆的数根是堆内的最大元素. 堆的意义在于能快速O( ...
随机推荐
- php apache用户写文件夹权限设置
php一般是以apache用户身份去执行的,把apache加入到存储你文件的父文件夹属组里去,然后改该父文件夹权限为775,这样属组成员就有写的权限,而apache属于这个组就可以改写该目录下所有文件 ...
- Exception→"Source":"EntityFramework" "Message" :"更新条目时出错。有关详细信息,请参阅内部异常。"
给一个数据库中类型为"datetime"的列赋值为 "DateTime.MinValue"...... 而// ::} But--01到9999-- :: 到 ...
- Java并发包源码学习之AQS框架(二)CLH lock queue和自旋锁
上一篇文章提到AQS是基于CLH lock queue,那么什么是CLH lock queue,说复杂很复杂说简单也简单, 所谓大道至简: CLH lock queue其实就是一个FIFO的队列,队列 ...
- PHPCMS几个有用的全局函数
1.$site_setting = get_site_setting($siteid); 这个get_site_setting()函数读取的是多站点中$siteid站点的相关配置,具体位置在网站根 ...
- MongoDB的学习和使用
一.下载mongodb. 官网下载, 或者http://www.360sdn.com/opensource-datasource/2015/0403/5584.html下载: http://fastd ...
- 关于cin,getchar(),scanf()的注意事项(转)
问题描述一:(分析scanf()和getchar()读取字符) scanf(), getchar()等都是标准输入函数,一般人都会觉得这几个函数非常简单,没什么特殊的.但是有时候却就是因为使用这些 ...
- mongodb 维护
如何释放空间? 1. 先用 remove 命令删除数据 2. repair.需要停机,即便你不停机的话 mongodb 自己也会锁住直到 repair 完成.注意要有足够的磁盘空间,需要额外一倍的空间 ...
- iOS开发——UI进阶篇(十七)CALayer,核心动画基本使用
一.CALayer简介 1.CALayer在iOS中,文本输入框.一个图标等等,这些都是UIView你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个其实UIView之所以 ...
- leetcode 102. Binary Tree Level Order Traversal
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...
- C++输入输出流
一.C++输入输出流的含义 以前所用到的输入和输出,都是以终端为对象的,即从键盘输入数据,运行结果输出到显示器屏幕上.从操作系统的角度看,每一个与主机相连的输入输出设备都被看作一个文件.程序的输入指的 ...