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

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


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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值