大一小白,假期在家,练习算法,发文记录下,如有不严谨之处,还请各位大佬指正。
今天我练习了牛客网shopping这个题,本人代码如下
#include<stdio.h>
void Fact(int c[10001],int h);//将商品价格从大到小排序。
int main()
{
int t,x,y,a[10001],b[10001],count;
double w;//每组商品最优价格。
scanf("%d",&t);
while(t--)
{
count=0;
int i=0;
w=0;
scanf("%d %d",&x,&y);
while(x--)
{
scanf("%d %d",&a[i],&b[i]);
if(b[i]==1) count+=1;//记录每组的凳子数
i+=1;
}
Fact(a,i);
int l=count<y? count:y;//取凳子数与购物车数的较小值。
for(int j=0;j<i;j++)
{
if(l>0) w+=(float)a[j]/2;
else w+=(float)a[j];
l-=1;
}
printf("%.1lf\n",w);
}
return 0;
}
void Fact(int c[10001],int h)
{
int i,j,temp;
for(i=0;i<h;i++) {
for(j=i+1;j<h;j++) {
if(c[j]>c[i]) {
temp=c[j];
c[j]=c[i];
c[i]=temp;
}
}
}
}
这题注意的点有两个: 1.简单贪心,找凳子数目和m的最小值。
2.将价格排序。