题目   SGU 171

相当好的贪心的题目!!!!!

题目意思就是说有K个赛区招收参赛队员,每个地区招收N[i]个,然后每个地区都有一个Q值,而N[i]的和就是N,表示总有N个参赛队员,每个队员都有他自己的P值,和他的权值W,只有当一个队员的P大于某一个地区的Q值时,权值W才能被记录在内,问怎样让着N个参赛队员选择地区才能让权值和最大。

贪心的思路就是按照权值W贪心

1、先按W的降序排序,优先考虑权值交大的。

2、歪了不影响后面的参赛队员,W较大的而且满足P>Q的,让其参加p>Q时Q最大的那一个。所以Q值按照降序排序。

3、如果某一个找不到一个Q使得P>Q,那么就让他参加Q最大的那一个赛区,这样可以给后面W更小的更多的机会

(这才发现贪心实在用的太巧秒了,以后更加的好好钻研)

实现见代码

 #include<iostream>
#include<stdio.h>
#include<string.h>
#include<map>
#include<vector>
#include<set>
#include<stack>
#include<queue>
#include<algorithm>
#include<cmath>
#include<stdlib.h>
using namespace std;
#define MAX(a,b) (a > b ? a : b)
#define MIN(a,b) (a < b ? a : b)
#define MAXN 500005
#define INF 1000000007
#define mem(a) memset(a,0,sizeof(a))
#define eps 1e-15 struct ZONE{int num,q,index;}zone[];//num招纳参赛人员的个数,Q值,以及保存这个地区最初编号(防止排序后打乱)
struct PERSON{int p,w,index,z;}per[];//P值,W值,编号,以及选择的地区
int K,N; int cmp_zone(ZONE a,ZONE b)//按照Q值的从大到小排序,这样的话每次就只需要找到满足P>Q时,Q最大的哪一个
{
return a.q > b.q;
} int cmp_per(PERSON a,PERSON b)//按照W的降序以及P的升序排序
{
if(a.p != b.p)return a.w > b.w;
return a.p < b.p;
} int cmp_index(PERSON a,PERSON b)//按照参赛人员最初的编号排序,保证输出的顺序
{
return a.index < b.index;
} int main()
{
while(~scanf("%d", &K))
{
int i;N=;
for(i=;i<K;i++)
{
scanf("%d",&zone[i].num);
zone[i].index = i+;//保存编号
N+=zone[i].num;
}
for(i=;i<K;i++)
{
scanf("%d",&zone[i].q);
}
sort(zone, zone+K,cmp_zone);//排序
for(i=;i<N;i++)
{
scanf("%d",&per[i].p);
}
for(i=;i<N;i++)
{
scanf("%d",&per[i].w);
per[i].index = i;
per[i].z = -;
}
sort(per,per+N,cmp_per);
int p = , z = , nz = ;//p表示选择到了第p个人,Q值最大而且还没有选择完全的地区编号
while(p<N && nz<N)
{
while(!zone[nz].num)nz++;//找到目前还没有被选择的Q值最大的地区
z=nz;
while((per[p].p <= zone[z].q || !zone[z].num ) && z<N)//找到满足P>Q的第一个地区
{
z++;
}
if(z<N)
{
per[p].z = zone[z].index;
zone[z].num--;
}
else if(z == N)
{
per[p].z = zone[nz].index;
zone[nz].num--;
}
p++;
}
sort(per,per+N,cmp_index);
for(i=;i<N;i++)
{
printf("%d%c",per[i].z,i==N-?'\n':' ');
}
}
return ;
}

SGU 171 Sarov zones (贪心)的更多相关文章

  1. SGU 171.Sarov zones

    简单的贪心.优先weight最大的,优先匹配Q值大的地区 code #include <iostream> #include <algorithm> #include < ...

  2. SGU 分类

    http://acm.sgu.ru/problemset.php?contest=0&volume=1 101 Domino 欧拉路 102 Coprime 枚举/数学方法 103 Traff ...

  3. [置顶] 2013_CSUST暑假训练总结

    2013-7-19 shu 新生训练赛:母函数[转换成了背包做的] shuacm 题目:http://acm.hdu.edu.cn/diy/contest_show.php?cid=20083总结:h ...

  4. Contest 7.21(贪心专练)

    这一次都主要是贪心练习 练习地址http://acm.hust.edu.cn/vjudge/contest/view.action?cid=26733#overview Problem APOJ 13 ...

  5. SGU 280.Trade centers(贪心)

    SGU 280.Trade centers 解题报告 题意: n(<=30000)个城市,(n-1)条道路,求最少需要选择多少个城市建造市场,使得所有城市到任意一个市场的距离不大于k. Solu ...

  6. sgu 195 New Year Bonus Grant【简单贪心】

    链接: http://acm.sgu.ru/problem.php?contest=0&problem=195 http://acm.hust.edu.cn/vjudge/contest/vi ...

  7. codeforce447 D SGU 548 贪心+优先队列

    codeforce447 D - DZY Loves Modification 题意:有一个n*m的矩阵,每次可以选择一行或者一列,可以得到这行或这列的所有元素sum的积分,然后使这一列/行的每一个元 ...

  8. SGU 296.Sasha vs. Kate(贪心)

    题意: 给出长度为n(<=1000)的一个数.输出删掉k个数字后的最大值. Solution: 简单贪心. s[i]代表数字s的第i位. 从前往后第一个满足s[i]>s[i-1]的位置,最 ...

  9. SGU - 186 - The Chain (贪心)

    186. The Chain time limit per test: 0.25 sec. memory limit per test: 4096 KB input: standard input o ...

随机推荐

  1. C#中跨线程读取控件值、设置控件值

    编写应用程序时,涉及到大量数据处理.串口通信.Socket通信等都会用到多线程,多线程中如何跨线程调用主界面或其他界面下的控件是一个问题,利用invoke和delegate可以解决. delegate ...

  2. UVa 11584 Partitioning by Palindromes

    题意: 给出一个字符串,求最少能划分成多少个回文子串. 分析: d[i] = min{d[j] + 1 | s[j+1]...s[i]是回文串} d[i]表示前 i 个字符最少能分割的回文子串的个数 ...

  3. HDU 3746 (KMP求最小循环节) Cyclic Nacklace

    题意: 给出一个字符串,要求在后面添加最少的字符是的新串是循环的,且至少有两个循环节.输出最少需要添加字符的个数. 分析: 假设所给字符串为p[0...l-1],其长度为l 有这样一个结论: 这个串的 ...

  4. pl/sql developer 连接本地ORACLE 11g 64位数据库

    1.登录PL/SQL Developer 这里省略Oracle数据库和PL/SQL Developer的安装步骤,注意在安装PL/SQL Developer软件时,不要安装在Program Files ...

  5. 锋利的jQuery读书笔记---jQuery中动画

    jQuery中的动画: 1.show和hide 2.fadeIn和fadeOut 3.slideUp和slideDown <!DOCTYPE html> <html> < ...

  6. .NET Framework个版本说明

    .NET Framework .NET版本 1.0 1.1 2.0 3.0 3.5 4.0 4.5 完整版本 1.0.3705.0 1.1.4322.573 2.0.50727.42 3.0.4506 ...

  7. C# chart绑定数据的方式整理

    C#chart 画图曲线的条数决定是你的数据源也就Series.Series是对象 你动态创建就可以了. 一.数组, List 等简单Collection类型的方式 Series s1= new Se ...

  8. C# winform 登录 单例模式(转)

    主界面配置代码: frmLogin Codz program.cs 代码 static class Program { public static EventWaitHandle ProgramSta ...

  9. HDU 5001-Walk(概率dp)

    题意: 给你一个图,求在长度为d的所有路径,不经过每个结点的概率 分析: 枚举每个结点,正推求概率 #include <map> #include <set> #include ...

  10. 【C++对象模型】构造函数语意学之一 默认构造函数

    默认构造函数,如果程序员没有为类定义构造函数,那么编译器会在[需要的时候]为类合成一个构造函数,而[需要的时候]分为程序员需要的时候和编译器需要的时候,程序员需要的时候应该由程序员来做工作,编译器需要 ...