Problem E: 985的买饮料难题
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 221 Solved: 118
Submit Status Web Board
Description
天气太热了,985制定了对未来的规划即第i天喝a[i]瓶饮料。为了节约开支,他打听到了第i天每瓶饮料的价格p[i]。
为了不让自己的规划落空,他想知道这n天他至少要花多少钱。
精明的985可以选择在任意一天买数目不限的饮料,而且他有一个神奇的冰箱,可以将提前购买的饮料保存下来(至少在这n天里是可以饮用的)。
Input
第一行输入一个整数t,代表有t组测试数据。
每组数据第一行输入一个整数n代表规划的总天数,接下来有n行,每行输入两个整数a[],p[]分别代表上面提到的信息。
注:1 <= t <= 30,1 <= n <= 1000,1 <= a[],p[] <= 100。
Output
输出一个整数代表最后的结果。
Sample Input
2 2 25 56 94 17 5 39 21 95 89 73 90 9 55 85 32
Sample Output
2998 6321
不难发现,第i天购买的最优单价是min(p[j]) (1 <= j <= i),那么直接统计一下前缀区间最小值即可.先按照价格从低到高排序,然后判断。#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int vis[1005];
struct st
{
int day,price,num;
}a[1005];
bool cmp(st a,st b) //排序从大到小
{
return a.price<b.price;
}
int main()
{
int t,n,i,j,zsum,sum;;
scanf("%d",&t);
while(t--)
{
zsum=0;
memset(vis,0,sizeof(vis));
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d",&a[i].num,&a[i].price);
a[i].day=i;
}
sort(a,a+n,cmp);
for(i=0;i<n;i++) //判断
{
if(vis[i]==1)
continue;
sum=a[i].num;
for(j=i+1;j<n;j++)
{
if(vis[j]==1)
continue;
if(a[i].day<a[j].day)
{
vis[j]=1;
sum+=a[j].num;
}
}
zsum+=sum*a[i].price;
}
printf("%d\n",zsum);
}
return 0;
}
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int vis[1005];
struct st
{
int day,price,num;
}a[1005];
bool cmp(st a,st b) //排序从大到小
{
return a.price<b.price;
}
int main()
{
int t,n,i,j,zsum,sum;;
scanf("%d",&t);
while(t--)
{
zsum=0;
memset(vis,0,sizeof(vis));
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d",&a[i].num,&a[i].price);
a[i].day=i;
}
sort(a,a+n,cmp);
for(i=0;i<n;i++) //判断
{
if(vis[i]==1)
continue;
sum=a[i].num;
for(j=i+1;j<n;j++)
{
if(vis[j]==1)
continue;
if(a[i].day<a[j].day)
{
vis[j]=1;
sum+=a[j].num;
}
}
zsum+=sum*a[i].price;
}
printf("%d\n",zsum);
}
return 0;
}