贪心的三道小题目

题目来源:挑战程序设计竞赛


一。题目链接:点击打开链接

这道排牛的题挺简单的,虽然我的代码算法和书上基本差不多,但是丑······还是贴书上的吧(还是我自己盲敲的害羞

#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
    bool left;
    int N, b(0), a(0), num(0);
    char s[2005] = {0};

    cin >> N;

    while(N--)
        cin >> s[b++];//printf(" S: %s\n", s);

    --b;
    while( a <= b )
    {
        left = false;

        for(int i = 0; i + a <= b; ++i)
            if(s[a + i] < s[b - i]){
                left = true;
                break;
            }
            else if(s[a + i] > s[b - i]){
                left = false;
                break;
            }

        if(left){
            putchar(s[a++]);
        }
        else{
            putchar(s[b--]);
        }

        if( ++num == 80 ){
            putchar('\n');
            num = 0;
        }
    }

    return 0;
}

二。题目链接:点击打开链接

莫名觉得这个题目贪心的很好玩。

提前知道是贪心写所以没啥好讲的。

就怕读到题目一脸懵逼的情况。

#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;

int main()
{
    int R, n, x[1005];

    while( cin >> R >> n && !( R == -1 && n == -1 ))
    {
        int num(0), k(0);

        for(int i = 0; i < n; ++i)
            scanf("%d", &x[i]);

        sort(x, x + n);

        while( k < n )
        {
            int step(0);
            while( k + step < n && x[k + step] <= x[k] + R )
                step++;

            k += step;
            step = 0;
            while( k + step < n && x[k + step] <= x[k - 1] + R )
                step++;

            k += step;

            ++num;
        }

        printf("%d\n", num);
    }

    return 0;
}

三。题目链接:点击打开链接

这道题目的哈夫曼算法在刘汝佳的书里有。

当然我是绝对想不到这两道题竟然是同一个解法。

而且刘汝佳的书里没有代码实现但是有证明。这本书相反,互相补充互相补充。。。

刘汝佳的书里写了个用队列和排列实现的nlogn算法,看懂了,以后有空敲出来再补充。

#include <iostream>
#include <algorithm>
using namespace std;

int solve(int L[], int N)
{
    int mi1 = 0, mi2 = 1;

    if( L[mi1] > L[mi2] )
        swap(mi1, mi2);

    for(int i = 2; i < N; ++i)
    if( L[i] < L[mi1] ){
        mi2 = mi1;
        mi1 = i;
    }
    else if( L[i] < L[mi2] ){
        mi2 = i;
    }

    if( mi1 == N - 1 )
        swap( mi1, mi2 );
    L[mi1] += L[mi2];
    L[mi2] = L[N - 1];

    return L[mi1];
}

int main()
{
    int N, L[20005] = {0};
    long long ans(0);

    cin >> N;
    for(int i = 0; i < N; ++i)
        cin >> L[i];

    while( N > 1 )
    {
        ans = ans + solve(L, N);//cout << ans << '\n';
        --N;
    }

    cout << ans;

    return 0;
}


2018.1.18更新

刚学了队列,用队列实现了上道题。我自己先写的,写完了发现和书上一样的!我真厉害。

算法还是哈夫曼。

#include <iostream>
#include <queue>
using namespace std;

int main()
{
    priority_queue<int, vector<int>, greater<int> > que;
    int N, input;
    long long ans(0);

    cin >> N;

    while( N-- )
    {
        cin >> input;
        que.push(input);
    }

    while( que.size() > 1 )
    {
        int temp1 = que.top();
        que.pop();
        int temp2 = que.top();
        que.pop();

        ans += (temp1 + temp2);

        que.push(temp1 + temp2);
    }

    cout << ans << endl;

    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值