高级光能
首先定义一个结构体sugar,包含sweet(甜度)和v(体积)
接着进行排序:
int comp(sugar a,sugar b)
{
if(a.sweet!=b.sweet)
return a.sweet>b.sweet;
return a.v>b.v;
}
void qsort(sugar a[],int l,int r)
{
int i=l,j=r;
sugar mid=a[(l+r)/2];
while(i<=j)
{
while(comp(a[i],mid)) i++;
while(comp(mid,a[j])) j--;
if(i<=j)
{
swap(a[i],a[j]);
i++;
j--;
}
}
if(l<j)
qsort(a,l,j);
if(i<r)
qsort(a,i,r);
}
我们只需要排sweet,在sweet相同的情况下再选择体积较大的。
排序后,在分别对sweet和v进行累加,最后输出即可。
资深守护
while (a[i]>mid) or (a[i]=mid) and (b[i]>mid1) do inc(i);
while (a[j]<mid) or (a[j]=mid) and (b[j]<mid1) do dec(j);
if i<=j then
begin
t:=a[i];
a[i]:=a[j];
a[j]:=t;
t:=b[i];
b[i]:=b[j];
b[j]:=t;
inc(i);
dec(j);
end;
until i>j;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
end;
初级守护
这题是贪心算法。
先把甜度按从大到小排序,如果甜度相同则体积大的排在前面。
排完序后把前k个甜度相加,再把前k个体积相加,最后输出前k个甜度相加的和以及前k个体积相加的和就行了。