贪心策略(假) 排序(真)
基本上三题都是因为排序被卡了一会
p1230 智力大冲浪
题目描述
原有m奖金
但第i事件没完成就会扣除wi的奖金
在n个时间内每个事件都有一个期限ti,在ti时间后该事件就不能完成。
求一个完成事件的顺序来保证扣的钱最少。
思路:
先让事件以w从大到小排序(贪心第一下),后从w最大的事件开始,把该事件放在他的截止时间点上(贪心第二下)。
被卡住的点
快排中mid的值不能改变的。
这是错的
void qsort(int l,int r){
int mid = (l+r)/2;
int i = l,j = r;
do{
while(game[i].w > game[mid].w) i++;
while(game[mid].w > game[j].w) j--;
if(i <= j){
swap(i,j);
i++;
j--;
}
}while(i<=j);
if(l<j) qsort(l,j);
if(i<r) qsort(i,r);
}
这是对的
void qsort(int l,int r){
int mid = game[(l+r)/2].w;
int i = l,j = r;
do{
while(game[i].w > mid) i++;
while(mid > game[j].w) j--;
if(i <= j){
swap(i,j);
i++;
j--;
}
}while(i<=j);
if(l<j) qsort(l,j);
if(i<r) qsort(i,r);
}
p2094 运输
题目描述
有n个商品,每次合并两件,合并后的商品的价值为(a+b)/k,a,b是第一件第二件商品,k是题目给出的量。
求最后合并的成唯一商品,最少多少钱。
思路
合并石子问题,就是说从第一次合并的开始,对于/
k要执行n%2次,对于第二次/k,要执行n%4.
也就是说,先合并的费用减小的多。
那么从大到小合并一下就可以了
p1056 排座椅
题目描述
教室为M x N,给出有前后相邻的同学,或者左右相邻的同学。
然后可以设置k条横向走廊,设置l条纵向走廊。
求最优的方案使得相邻同学最少。
思路
桶排,记录第i 和 i+i行有多少对相邻的同学,列同理。
然后从大到小排序后,得到在哪些行放走廊
最后再对答案从小到达排序输出