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)的更多相关文章

  1. Moo University - Financial Aid POJ 2010 优先队列(最大堆)

    题目:http://poj.org/problem?id=2010 题目大意: 奶牛上大学.因为经济问题,每头奶牛都需要一定的补助需求,学校会提供一定的资金用于补助 每头牛都有自己的分数,学校招收的名 ...

  2. Heap:Moo University - Financial Aid(POJ 2010)

       牛的学校 题目大意:这只Bessie真是太顽皮了,她又搞了个学校,准备招生,准备通过一个考试筛选考生,但是不能招到每个学生,每个学生也不能一定能上学,要资助,问你在一定资金内,怎么收学生,使收到 ...

  3. POJ 2010 Moo University - Financial Aid( 优先队列+二分查找)

    POJ 2010 Moo University - Financial Aid 题目大意,从C头申请读书的牛中选出N头,这N头牛的需要的额外学费之和不能超过F,并且要使得这N头牛的中位数最大.若不存在 ...

  4. poj 2010 Moo University - Financial Aid

                                                                                                Moo Univ ...

  5. 【POJ - 2010】Moo University - Financial Aid(优先队列)

    Moo University - Financial Aid Descriptions 奶牛大学:奶大招生,从C头奶牛中招收N(N为奇数)头.它们分别得分score_i,需要资助学费aid_i.希望新 ...

  6. poj 2010 Moo University - Financial Aid 最大化中位数 二分搜索 以后需要慢慢体会

    Moo University - Financial Aid Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 6599   A ...

  7. Moo University - Financial Aid

    Moo University - Financial Aid Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6020 Accep ...

  8. poj 2010 Moo University - Financial Aid(优先队列(最小堆)+ 贪心 + 枚举)

    Description Bessie noted that although humans have many universities they can attend, cows have none ...

  9. POJ 2010 - Moo University - Financial Aid 初探数据结构 二叉堆

    考虑到数据结构短板严重,从计算几何换换口味= = 二叉堆 简介 堆总保持每个节点小于(大于)父亲节点.这样的堆被称作大根堆(小根堆). 顾名思义,大根堆的数根是堆内的最大元素. 堆的意义在于能快速O( ...

随机推荐

  1. OB函数

    ob_start                    打开输出控制缓冲 ob_get_contents        返回输出缓冲区内容 ob_clean                   清空( ...

  2. Windows疑难杂症之开机无法显示桌面。

    开机无法显示桌面可能有以下两种情况. 1.系统故障或病毒引起explorer.exe无法加载启动. 2.注册表故障造成默认的值不是explorer.exe.(可能是安装了某些软件造成此问题) 3,某开 ...

  3. 如何给wordpress外部链接自动添加nofollow

    wordpress多作者博客可以丰富网站的内容,但同时也会产生一些无关的链接,例如有些投机的人会考虑在文章中随意添加外部链接,如果你不想给这些外部链接传递权重,你需要给这些外部链接加上 rel=&qu ...

  4. button事件驱动

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. 正确理解JavaScript中的this关键字

    JavaScript有this关键字,this跟JavaScript的执行上下文密切相关,很多前端开发工程师至今对this关键字还是模棱两可,本文将结合代码讲解下JavaScript的this关键字. ...

  6. HDU 5596(更新,两种方法)

    更新: 这是中文题目的链接: http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=659&pid=1001 ...

  7. Unity开发-你必须知道的优化建议

    转自:http://blog.csdn.net/leonwei/article/details/18042603 最近研究U3D开发,个人认为,精通一种新的技术,最快最好的方法就是看它的documen ...

  8. 跟着百度学PHP[4]OOP面对对象编程-6-构造方法(__construct)和构析方法(__destruct)

    函数就是成员方法(方法有三:构造方法.成员方法.析构方法) 下面是两种方法. 构造方法和构析方法 00x1 构造方法 构造方法会在创建对象之后自动调用.其名称为__construct <?php ...

  9. 用 ROS 做内网DNS服务器

    转载:http://iliuyong.iteye.com/blog/1035692 用 ROS 做内网DNS服务器方法:1.ROS 设置IP ->DNS 选择"static" ...

  10. 1.8---字符串是否是旋转而成(CC150)

    答案:利用了XY , YX中第一个XYXY包含了第二个 public class Solution{ public static void main(String[] args){ System.ou ...