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. springMVC 缓存(入门 spring+mybaties+redis一)

    使用redis之前需要咋电脑上安装redis: 使用spring+mybaties+redis的本质是扩展类   org.apache.ibatis.cache.Cache:在我们自己扩展的Cache ...

  2. Oracle的分区操作和修改分区主键

    1.增加一个分区ALTER TABLE sales ADD PARTITION jan96 VALUES LESS THAN ( '01-FEB-1999' ) TABLESPACE tsx;增加一个 ...

  3. svn还原到指定版本

    svn还原到指定版本 1,选中文件夹,右健,show log 2,选中指定版本,右健,Revert to this revision 3,svn commit 4,ok

  4. hdu1026.Ignatius and the Princess I(bfs + 优先队列)

    Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  5. loadrunner-27796错误寻求解决办法

    Action.c(58): Error -27796: Failed to connect to server "www.baidu.com:80": [10048] Addres ...

  6. java之Timer

    一.Java2的开发包中提供了一种很好使用的线程功能:你可以使用这些类创建后台进程,让其在等待一段规定的时间后执行,或者让其每隔一段时间执行.你也可以用Thread来完成,但利用Timer与Timer ...

  7. 信号屏蔽的切换的理解sigsuspend

    #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <unistd.h&g ...

  8. android ListView嵌套GridView显示不全问题

    只需重写GridView即可:public class MyGridView extends GridView{ public MyGridView(android.content.Context c ...

  9. angularjs获取参数方法

    链接:/tab/newsview?id=58 .controller('NewsViewCtrl', ["$scope", "$location"," ...

  10. jq常用的方法

    .eq(i) //获取第几个元素 .text() //获取或设置元素文本内容 .html() //获取或设置元素html代码内容 .val() //获取或设置表单元素值 .attr() //获取或设置 ...