HDU(5999): The Third Cup is Free
題目:
Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2154 Accepted Submission(s): 1017
Problem Description
Panda and his friends were hiking in the forest. They came across a coffee bar inside a giant tree trunk.Panda decided to treat everyone a cup of coffee and have some rest. Mr. Buck, the bartender greeted Panda and his animal friends with his antler. He proudly told them that his coffee is the best in the forest and this bar is a Michelin-starred bar, thats why the bar is called Starred Bucks.
Input
The first line of the input gives the number of test cases, T.T test cases follow. Each test case consists of two lines. The first line contains one integer N, the number of cups to be bought.
Output
For each test case, output one line containing “Case #x: y”, where x is the test case number (starting from 1) and y is the least amount of money Panda need to pay.
limits∙ 1 ≤ T ≤ 100.∙ 1 ≤ N ≤ 105.∙ 1 ≤ pi ≤ 1000.
Sample Input
2
3
1 2 3
5
10 20 30 20 20
Sample Output
Case #1: 5
Case #2: 80
題意:
一隻熊貓打算請他的朋友喝咖啡,咖啡館有個優惠:買三杯咖啡,然後三杯中最便宜的一杯會免費;現已知咖啡杯數和每杯咖啡的價格,求熊貓最少需花多少錢請他的朋友喝咖啡?
誤區:
已知每杯咖啡的價格,對所有咖啡進行從小到大排序,3個數一組去掉每組第一個數。這種做法很明顯是把便宜的咖啡放在一起再去掉便宜的,得到的答案不是花費最少的方案。
解題:
1、對所有數排序(從大到小);
2、咖啡數n與3取餘,結果為0或1或2,如果是0,表示咖啡杯數剛好分組,直接去掉每組中最小的一個數即可;1或2表示整個排序後的數列的第n-1個數和第n-2個數是必須要算入sum;每組中去掉最小的一個數,用for迴圈處理,sum遍歷時加上每組的第一、二個數,迴圈直到n-3結束。
#include<cstdio>
#include<algorithm>
using namespace std;
int x[100000];
int cmp(int a,int b)
{
return a>b;
}
int main()
{
int T;
scanf("%d",&T);
int ans=0;
while(T--)
{
ans++;
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&x[i]);
sort(x,x+n,cmp);
int sum=0;
if(n%3==0)
{
for(int i=0;i<n;i+=3)
sum+=x[i];
for(int i=1;i<n;i+=3)
sum+=x[i];
}
else
{
int t=n%3;
for(int i=0;i<n-t;i+=3)
sum+=x[i];
for(int i=1;i<n-t;i+=3)
sum+=x[i];
if(t==2)
{
sum+=x[n-1];
sum+=x[n-2];
}
if(t==1)
sum+=x[n-1];
}
printf("Case #%d: %d\n",ans,sum);
}
return 0;
}