【贪心】【AOJ-02】Home Work

Description
临近开学了,大家都忙着收拾行李准备返校,但I_Love_C却不为此担心!
因为他的心思全在暑假作业上:目前为止还未开动(-_-!!还以为他有多冷静呢)。

暑假作业是很多张试卷,我们这些从试卷里爬出来的人都知道,卷子上的题目有选择题、填空题、简答题、证明题等。
而做选择题的好处就在于工作量很少,但又因为选择题题目都普遍很长。
如果有5张试卷,其中4张是选择题,最后一张是填空题,很明显做最后一张所花的时间要比前4张长很多。
但如果你只做了选择题,虽然工作量很少,但表面上看起来也已经做了4/5的作业了。
I_Love_C决定就用这样的方法来蒙混过关。

他统计出了做完每一张试卷所需的时间以及它做完后能得到的价值(按上面的原理,选择题越多价值当然就越高咯)。
现在就请你帮他安排一下,用他仅剩的一点时间来做最有价值的作业。
Input
测试数据包括多组。
每组测试数据以两个整数M,N(1≤M≤20, 1≤N≤10000)开头,分别表示试卷的数目和I_Love_C剩下的时间。
接下来有M行,每行包括两个整数T,V(1≤T≤N,0<V<10000),分别表示做完这张试卷所需的时间以及做完后能得到的价值!
输入以0 0结束。
Output
对应每组测试数据输出I_Love_C能获得的最大价值。
保留小数点2位

Sample Input
4 20
4 10
5 22
10 3
1 2
0 0

 
Sample Output
37.00

 
Hint
float的精度可能不够。
你应该使用double类型。
注意:每张试卷不一定需要全部做完,做一部分,可以得到一部分的价值。
 
 
思路:
因为没张试卷不一定全部做完,所以需要用到平均价值,先做平均价值大的题目
 
PS:这题拿到了测试数据,在此附上部分测试数据,同学们可以用来检验自己的程序
 
date.in:
4 20
4 10
5 22
10 3
1 2
19 3907
224 5203
744 3612
2645 2626
789 5689
3651 1537
1669 4593
1488 2789
246 6102
1481 6051
2604 8048
2143 8675
3375 1288
434 185
1942 6849
3836 827
2335 5038
956 2569
634 1835
2455 2689
16 9395
847 6241
3153 3205
7195 280
3444 1706
7338 9324
699 878
8383 1751
5769 6198
5392 7680
5204 9613
301 2492
3562 8149
1480 3776
971 8208
1371 2871
3863 6418
 
data.out:
37.00
28369.33
33331.16
 
参考代码:
#include <iostream> 
#include <stdio.h> 
using namespace std; 
  
typedef struct va //定义一个结构体储存每张试卷所用时间,价值,及平均价值比
{ 
    int time; 
    int val; 
    int index; 
    double val_p; 
}va; 
  
void sort(va *s,int n) //冒泡排序
{ 
    int i,j; 
    int tmp; 
    double temp; 
    for(i=0;i<n-1;i++) 
    { 
        for(j=0;j<n-1-i;j++) 
        { 
            if(s[j].val_p<s[j+1].val_p) 
            { 
                temp=s[j].val_p; 
                s[j].val_p=s[j+1].val_p; 
                s[j+1].val_p=temp; 
                tmp=s[j].time; 
                s[j].time=s[j+1].time; 
                s[j+1].time=tmp; 
                tmp=s[j].val; 
                s[j].val=s[j+1].val; 
                s[j+1].val=tmp; 
            } 
        } 
    } 
} 
  
int main() 
{ 

    va s[10001]; 
    int m,n; 
    int t,v; 
    int j=0,k=0,i=0; 
    double val=0; 
    while(cin>>m>>n&&(m||n)) 
    { 
        val=j=k=i=0; 
        for(i=0;i<m;i++) 
        { 
            cin>>t>>v; 
            s[i].time=t; 
            s[i].val=v; 
            s[i].index=i; 
            s[i].val_p=(double)v/(double)t; 
        } 
        sort(s,m); 
        while(n>0&&m>0) 
        { 
            if(n>=s[j].time) //如果剩余时间足以做完一张试卷,直接减
            { 
                val+=s[j].val; 
                n-=s[j].time; 
                m--; 
            } 
            else
            { 
                for(k=0;k<s[j].time;k++) //否则每次减1分钟
                { 
                    val+=s[j].val_p; 
                    n--; 
                    if(n<=0) 
                        break; 
                } 
                m--; 
            } 
            j++; 
        } 
        printf("%.2f
",val); 
    } 
    return 0; 
}
原文地址:https://www.cnblogs.com/ahu-shu/p/3489278.html