懒虫小鑫
Time Limit: 1000 ms Memory Limit: 65536 KiB
Submit Statistic Discuss
Problem Description
小鑫是个大懒虫,但是这一天妈妈要小鑫去山上搬些矿石去城里卖以补贴家用。小鑫十分的不开心。不开心归不开心,小鑫还是要做这件事情的。
我们把这个事情简化一下。有n块矿石,设第i块矿石由两个数字wi和pi表示。分别表示这块石头的重量和可以卖的价钱。小鑫每次只能搬一块矿石去城里卖,所以他决定每次都会搬重量最小的那块。如果恰好有几块重量相等,那就在这几块中挑选价值最高的带走。
由于路程原因。小鑫每天只能打m个来回,也就意味着他只能卖掉m块矿石。你能计算出他能得到多少钱么?
Input
输入数据有多组,到文件结束。
对于每一组数据,第一行为n,m。m≤n≤10000。
接下来有n行,每行两个数代表石头的w与p。
Output
对于每组数据,输出有一行为一个数,为答案。
Sample Input
4 2
1 2
1 3
2 2
3 4
Sample Output
5
Hint
Source
#include<stdio.h>
#include<stdlib.h>
struct node
{
int w,p;
} a[10001];
void arrange(struct node a[],int left,int right)
{
struct node x=a[left];
int i=left,j=right;
if(i>=j)return ;
while(i<j)
{
while(i<j)
{
if(a[j].w>x.w)
j--;
else if(a[j].w==x.w)
{
if(a[j].p<=x.p)
j--;
else break;
}
else break;
}
a[i]=a[j];
while(i<j)
{
if(a[i].w<x.w)
i++;
else if(a[i].w==x.w)
{
if(a[i].p>=x.p)
{
i++;
}
else break;
}
else break;
}
a[j]=a[i];
}
a[i]=x;
arrange(a,left,i-1);
arrange(a,i+1,right);
}
int main()
{
int n,m,i,sum;
while(~scanf("%d%d",&n,&m))
{
for(i=0; i<n; i++)
{
scanf("%d%d",&a[i].w,&a[i].p);
}
arrange(a,0,n-1);
sum=0;
for(i=0; i<m; i++)
{
sum+=a[i].p;
}
printf("%d\n",sum);
}
return 0;
}
Think:
这里说明一下对快排的理解,之前都是一知半解,以至于现在提交的两个题都是WA,重新理解了一下快排
void arrange(struct node a[],int left,int right)
{
struct node x=a[left];
int i=left,j=right;
if(i>=j)return ;
while(i<j)
{
while(i<j)
{
if(a[j].w>x.w)
j--;
else if(a[j].w==x.w)
{
if(a[j].p<=x.p)
j--;
else break;
}
else break;
}
a[i]=a[j];
while(i<j)
{
if(a[i].w<x.w)
i++;
else if(a[i].w==x.w)
{
if(a[i].p>=x.p)
{
i++;
}
else break;
}
else break;
}
a[j]=a[i];
}
a[i]=x;
arrange(a,left,i-1);
arrange(a,i+1,right);
快排为什么要先用一个x=a[left]那,因为要空出一个位置,然后从后面开始往前找,只要是比x小的数就要放到那个空位置上,这时候后面由于拿到前面去了一个数,就会空出一个位置,所以下一步就是从前面开始往后找了,找到一个比x大的数就又放到了后面的空位置上,前面就因此多出来了一个空位置……直到i=j的时候,不管怎样,i和j最终都会指向一个空位置,这个时候就把x放到这个空位置上就可以了,所以这个时候不管a[i]=x还是a[j]=x都对,这样一趟快排就结束了为什么要有外面的那一层循环那?(自己跌在了这个地方好多次)因为这时候就是利用递归了,arrange(a,left,i-1);把左右端点都换了,然后重新进入函数,对前一部分进行排序,退出后执行第二个函数,对后面进行排序,然后前面的部分又拆分成了2部分,执行相同的函数排好序,这个条件实际上就是递归出口,当拆分到一定程度,i==j的时候就会退出函数,一步步的退出就结束了快排了