Problem D. T-shirts
Time limit
5000 ms
Memory limit
262144 kB
It was the second day of IBM Chill Zone, and it was the time for distributing the prizes. Unfortunately due to unknown reasons, the organizing committee can only buy T-shirts to the contestants or give them D dollars in cash. The T-shirts factory only permitted them to order a single bulk of T-shirts of the same size where a single T-shirt price was determined using this equation:
C × S
Where C is a given constant, and S is the size of the T-shirt. There was only one limitation on the T-shirts they will give to the contestants, any contestant only accepts to receive a T-shirt of greater or equal size but not smaller size. The organizing committee decided to minimize the money they should pay . Please help them in determining the amount they need to pay in order to give each contestant either a T-shirt or D dollars.
Input
T the number of test cases. For each test case there will be three integers N, D and C , then N integers representing the size of each of the T-shirt of each of the contestants.
1 ≤ T ≤ 100 1 ≤ N ≤ 100, 000
1 ≤ D ≤ 10, 000
1 ≤ C ≤ 10, 000
1 ≤ t − shirtsize ≤ 100, 000
Output
For each test case print a single line containing: Case_x:_y x is the case number starting from 1. y is is the required answer. Replace the underscores with spaces.
Input
1
5 100 1
35 70 75 90 110
output
Case 1: 425
Note
The optimal solution is to buy 3 tshirts of size 75 for the first 3 contestants, and give 100 dollars to the last two.
看懂之后挺简单的, 求出最小花费。买t-shirt只能买一种码的, 因此暴力枚举求出所有可能的情况并保存最小值.
#include <bits/stdc++.h>
using namespace std;
long long a[1111111];
int main(){
int t, n, d, c, cnt;
scanf("%d", &t);
cnt = 0;
while(t--){
scanf("%d %d %d", &n, &d, &c);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
sort(a + 1, a + n + 1);
long long m;
m = 1ll*d*n;
for(int i = n; i >= 1; i--){
m = min(m, 1ll*d*(n - i) + 1ll*a[i]*i*c);
}
printf("Case %d: %lld\n", ++cnt, m);
}
return 0;
}
用scanf读入后台测试数据是1000多毫秒, 用cin和cout话是直接超时。。
#include <bits/stdc++.h>
using namespace std;
long long a[1111111];
int main(){
ios::sync_with_stdio(0); //蜜汁开关
int t, n, d, c, cnt;
cin >> t;
cnt = 0;
while(t--){
scanf("%d %d %d", &n, &d, &c);
for(int i = 1; i <= n; i++) cin >> a[i];
sort(a + 1, a + n + 1);
long long m;
m = 1ll*d*n;
for(int i = n; i >= 1; i--){
m = min(m, 1ll*d*(n - i) + 1ll*a[i]*i*c);
}
cout << "Case " << ++cnt << ": " << m << endl;
}
return 0;
}
cin慢是有原因的,其实默认的时候,cin与stdin总是保持同步的,也就是说这两种方法可以混用,而不必担心文件指针混乱,同时cout和stdout也一样,两者混用不会输出顺序错乱。正因为这个兼容性的特性,导致cin有许多额外的开销。
只需一个语句std::ios::sync_with_stdio(false);,这样就可以取消cin于stdin的同步了。
结果后台测试数据是3000多毫秒.。。
吓得我以后不敢用cin和cout 了 。。。