懒虫小鑫
roblem Description
小鑫是個大懶蟲,但是這一天媽媽要小鑫去山上搬些礦石去城里賣以補貼家用。小鑫十分的不開心。不開心歸不開心,小鑫還是要做這件事情的。 我們把這個事情簡化一下。有n塊礦石,設第i塊礦石由兩個數字wi和pi表示。分別表示這塊石頭的重量和可以賣的價錢。小鑫每次只能搬一塊礦石去城里賣,所以他決定每次都會搬重量最小的那塊。如果恰好有幾塊重量相等,那就在這幾塊中挑選價值最高的帶走。 由于路程原因。小鑫每天只能打m個來回,也就意味著他只能賣掉m塊礦石。你能計算出他能得到多少錢么?Input
輸入數據有多組,到文件結束。 對于每一組數據,第一行為n,m。m≤n≤10000。 接下來有n行,每行兩個數代表石頭的w與p。Output
對于每組數據,輸出有一行為一個數,為答案。Example Input
4 2 1 2 1 3 2 2 3 4Example Output
5
#include <stdio.h>
#include <stdlib.h>
struct node
{
? ? int w,p,h;
}a[10001],t;
void q(struct node a[],int l,int r)//快速排序;
{
? ? struct node key=a[l];
? ? int i=l,j=r;
? ? if(l>=r) return;
? ? if(l<r)
? ? {
? ? while(i<j)
? ? {
? ? ? ? while(i<j&&a[j].w>key.w) j--;
? ? ? ? while(i<j&&a[j].w==key.w)//質量相等則選價格高的;
? ? ? ? {
? ? ? ? ? ? if(a[j].p>key.p) break;
? ? ? ? ? ? else
? ? ? ? ? ? ? ? j--;
? ? ? ? }
? ? ? ? a[i]=a[j];
? ? ? ? while(i<j&&a[i].w<key.w)
? ? ? ? ? ? i++;
? ? ? ? while(i<j&&a[i].w==key.w)
? ? ? ? {
? ? ? ? ? ? if(a[i].p<key.p) break;//質量相等,則選價格高的;
? ? ? ? ? ? else i++;
? ? ? ? }
? ? ? ? a[j]=a[i];
? ? }
? ? a[i]=key;
? ? q(a,l,i-1);
? ? q(a,i+1,r);
}
}
int main()
{
? ? int i,m,n,c;
? ? while(~scanf("%d%d",&n,&m))
? ? {
? ? ? ? c=0;
? ? ? ? for(i=0;i<n;i++)
? ? ? ? ? ? scanf("%d%d",&a[i].w,&a[i].p);
? ? ? ? q(a,0,n-1);
? ? ? ? for(i=0;i<m;i++)
? ? ? ? ? ? c+=a[i].p;
? ? ? ? printf("%d\n",c);
? ? }
? ? return 0;
}
總結
- 上一篇: 数据结构实验之排序四:寻找大富翁
- 下一篇: 【总结】字符串匹配: KMP 和 拓展K