Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 21631 | Accepted: 7689 |
Description
Input
Output
Sample Input
1 3 3 100 25 150 35 80 25 2 120 80 155 40 2 100 100 120 110
Sample Output
0.649
做这题的时候,一开始的想法就是暴力枚举,虽然这样可能会超时,但是觉得可以做强有力的剪枝,于是就试了下,可是没有做论证推断,不知道应该怎样去做剪枝,其实主要是嫌麻烦,下面是我简单的枚举代码,不过超时了。
#include <stdio.h> #include <stdlib.h> #define MAX 100 struct Dev{ int b; int p; }dev[MAX][MAX]; int n; float result = -1; void Init() { int i, j; for(i=0; i < MAX; i++) { for(j=0; j < MAX; j++) { dev[i][j].b= -1; dev[i][j].p = -1; } } } void PrintData(int *data, int *sum) { int min=data[0], temp=sum[0], i; float tempRes; for(i=1; i < n; i++) { if(data[i] < min) min = data[i]; temp += sum[i]; } tempRes = min*1.0/ temp; if(tempRes > result) result = tempRes; } void SolveCase(int *data,int *sum, int depth) { int i; for(i=0; i<MAX && dev[depth][i].b != -1; i++) { data[depth] = dev[depth][i].b; sum[depth] = dev[depth][i].p; if(depth==n-1) PrintData(data, sum); else SolveCase(data,sum, depth+1); } } int main() { // freopen("input.txt","r",stdin); int caseNum, number; int *testData, *sum , i, j; scanf("%d",&caseNum); while(caseNum > 0) { Init(); scanf("%d", &n); for(i=0; i < n; i++) { scanf("%d",&number); for(j=0; j < number; j++) scanf("%d %d", &dev[i][j].b, &dev[i][j].p); } testData = (int *)malloc(sizeof(int)*n); sum = (int *)malloc(sizeof(int)*n); SolveCase(testData,sum,0); printf("%.3f\n",result); result = -1; caseNum--; } free(testData); free(sum); // fclose(stdin); return 0; }
超时之后,感觉可以用贪心做,然后贪心的话每次使得b 值增大,使得 p 值减少,这样才能使得结果是最大了,思路很简单,以为还是不行,结果AC 了.....
#include<cstdio> #include<cstring> int main() { // freopen("input.txt","r",stdin); int t,n,m,b[105][105],fac[105],p[105][105],flag[32767],max,min,tp; scanf("%d",&t); while(t--){ max=0,min=9999999; scanf("%d",&n); memset(flag,0,sizeof(flag)); for(int i=0;i<n;i++){ scanf("%d",&fac[i]); for(int j=0;j<fac[i];j++){ scanf("%d%d",&b[i][j],&p[i][j]); flag[b[i][j]]=1; if(max<b[i][j]) max=b[i][j]; if(min>b[i][j]) min=b[i][j]; } } double result=0; for(int i=min;i<=max;i++){ if(flag[i]){ int sum=0; for(int j=0;j<n;j++){ tp=99999999; for(int k=0;k<fac[j];k++){ if(b[j][k]>=i&&p[j][k]<tp){ tp=p[j][k]; } } sum+=tp; } double temp=(double)i/sum; if(result<temp) result=temp; } } printf("%.3f\n",result); } // fclose(stdin); return 0; }