HDU acm step:Chapter one section three(简单贪心)

来源:互联网 发布:幼儿园软件设施 编辑:程序博客网 时间:2024/06/05 02:36

这次的题目除了第四题和最后一题,都是贪心题。


1.3.1 Moving Tables

策略:将处于对面的当作是同一个位置,每次占用在相应的位置加一,全部数完之后求出最大的占用的那个值,就是最大的时间了。开始出现的错误是没有分开求占用。


1.3.2 今年暑假不AC

策略:先拍结束时间,从小到大排序。在比较开始时间与上一次的结束时间。大于的表示可以。


1.3.3Tian Ji -- The Horse Racing

策略:

先排序。

首先比较最低的,前者的最低大于后者,直接比赛。


前者的最低小于后者,前者的最低与后者的最高比赛。


前者的最低等于后者的最低时:再比较两者的最高,

若前者的最高高于后者的最高,那么直接前者的最低与后者的最低比赛,前者的最高与后者的最高比赛。

若前者的最高低于后者的最低,那么直接前者的最低与后者的最高比赛。

若前者的最高等于后者的最高,那么再比较前者的最低与后者的最高,若相等,则全部相等。若小于,那么前者的最低与后者的最高比赛。


开始的做法忽略了等于的时候的若干种请款


1.3.4 第二小整数

求得最大和第二大,输出第二大。


1.3.5 Saving HDU

策略:单位体积价格非增排序,从头开始。


1.3.6 悼念512汶川大地震遇难同胞——老人是真饿了

策略:大米单价非减排序,从头开始取。


1.3.7 Crixalis's Equipment

策略:计算需要体积和占用体积的差值,将差值从从大到小排序,当差值相同时,选择需要体积大的排在前面。(但是这里有没有都是一样过了),然后从头开始取。


1.3.8  Who's in the Middle

排序,去中位值。(开始的做法是只有一组,然后一直报错。可是题目本身也没说有很多组啊!)



1.3.1


#include <bits/stdc++.h>using namespace std;int a[1100], b[1100];int main(){    int n;    while(cin >> n && n != 0)    {        for(int i = 0; i < n; i++)        {            cin >> a[i];        }        sort(a, a+n);        for(int i = 0; i < n; i++)        {            cin >> b[i];        }        sort(b, b+n);        int ha = n-1, hb = n-1;        int la = 0, lb = 0;        int sum = 0;        int i = 0, j = 0;        while(ha >= la && hb >= lb)        {            if(a[la] > b[lb])            {                la++;                lb++;                sum += 200;            }            else if(a[la] < b[lb])            {                la++;                hb--;                sum -= 200;            }            else            {                if(a[ha] > b[hb])                {                    ha--;                    hb--;                    sum += 200;                }                else if(a[ha] < b[hb])                {                    hb--;                    la++;                    sum -= 200;                }                else                {                    if(a[la] < b[hb])                    {                        sum -= 200;                        la++;                        hb--;                    }                    else if(a[la] == b[hb])                    {                        break;                    }                }            }        }        cout << sum << endl;    }    return 0;}

1.3.4

#include <bits/stdc++.h>using namespace std;int main(){    int t;    cin >> t;    while(t--)    {        int n;        cin >> n;        int maxn, second_maxn;        int a;        cin >> maxn >> second_maxn;        n--;        n--;        if(maxn > second_maxn)        {            swap(maxn, second_maxn);        }        while(n--)        {            cin >> a;            if(a <= maxn)            {                maxn = a;            }            else if(a > maxn && a < second_maxn)            {                second_maxn = a;            }        }        cout << second_maxn << endl;    }    return 0;}

1.3.5

#include <bits/stdc++.h>using namespace std;const int maxn = 1100;struct treasure1{    int pi, mi;};treasure1 treasure[maxn];bool cmp (treasure1 a, treasure1 b){    return a.pi > b.pi;}int main(){    int v, n;    while(cin >> v && v != 0)    {        cin >> n;        int sum = 0;        for(int i = 0; i < n; i++)        {            scanf("%d%d", &treasure[i].pi, &treasure[i].mi);        }        sort(treasure, treasure+n, cmp);        for(int i = 0; i < n && v > 0; i++)        {            if(treasure[i].mi <= v)            {                v = v - treasure[i].mi;                sum += treasure[i].pi * treasure[i].mi;            }            else            {                sum += treasure[i].pi * v;                v = 0;            }        }        printf("%d\n", sum);    }}

1.3.6

#include <bits/stdc++.h>using namespace std;const int maxn = 1010;struct dot{    double a, b;};dot dot1[maxn];bool cmp(dot i, dot j){    return i.a < j.a;}int main(){    int t;    cin >> t;    while(t--)    {        double money;        int num;        double sum = 0;        cin >> money >> num;        for(int i = 0; i < num; i++)        {            scanf("%lf%lf", &dot1[i].a, &dot1[i].b);        }        sort(dot1, dot1+num, cmp);        for(int i = 0; i < num && money != 0; i++)        {            if(money > dot1[i].a*dot1[i].b)            {                sum += dot1[i].b;                money -= dot1[i].a*dot1[i].b;            }            else            {                sum += (money/dot1[i].a);                break;            }        }        printf("%.2f\n", sum);    }    return 0;}

1.3.7

#include <bits/stdc++.h>using namespace std;struct cost{    int take, need;};cost cost1[10100];bool cmp(cost a, cost b){    if(a.need - a.take != b.need - b.take)        return a.need - a.take > b.need - b.take;    else        return a.need > b.need;}int main(){    int t;    cin >> t;    while(t--)    {        int take1, n;        cin >> take1 >> n;        for(int i = 0; i < n; i++)        {            scanf("%d%d", &cost1[i].take, &cost1[i].need);        }        sort(cost1, cost1+n, cmp);        int flag = 0;        for(int i = 0; i < n; i++)        {            if(cost1[i].need > take1 || cost1[i].take > take1)            {                flag = 1;                break;            }            else            {                take1 = take1 - cost1[i].take;            }        }        if(flag == 0)        {            cout << "Yes" << endl;        }        else        {            cout << "No" << endl;        }    }    return 0;}

1.3.8

#include <bits/stdc++.h>using namespace std;int a[10010];int main(){    int n;    while(cin >> n)    {        for(int i = 0; i < n; i++)        {            scanf("%d", &a[i]);        }        sort(a, a+n);        cout << a[(n-1)/2] << endl;    }    return 0;}


0 0