挑战程序设计竞赛(第一章)

10 篇文章 0 订阅

三角形

参考博文:挑战程序设计竞赛: 三角形
思路:先排序,使得可以确定比较时的最大边,然后遍历,每一次取三个边,判断是否满足三角形条件。
代码:

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

const int MAX = 101;

bool check(int a, int b, int c)
{
    if(a+b>c) return 1;
    else      return 0;
}
int main()
{
    int n, a[MAX];
    while(cin >> n)
    {
        for(int i=0; i<n; i++)
            cin >> a[i];
            
        //排序的目的是使得k对于最长的边
        sort(a, a+n);
        int Max = 0;

        for(int i=0; i<n; i++)
        {
            for(int j=i+1;j<n; j++)
            {
                for(int k=j+1; k<n; k++)
                {
                    if(check(a[i], a[j], a[k]) && a[i]+a[j]+a[k]>Max)
                        Max = a[i]+a[j]+a[k];
                }
            }
        }
        cout << Max << endl;
    }
    return 0;
}
Ants

参考博文:挑战程序设计竞赛:Ants
方法一:
思路:
最短时间:需要取得最靠近中间的蚂蚁,然后求出其最短到达边缘(任意一边均可)的时间。
最长时间:需要取得最靠近边缘的蚂蚁(任意一边均可),然后求出其到达另一边的时间。
代码:

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

const int MAX = 1000001;
int a[MAX];

int main()
{
    int T, L, n;
    scanf("%d", &T);

    while(T--)
    {
        scanf("%d%d", &L, &n);
        for(int i=0; i<n; i++)
            scanf("%d", &a[i]);
        sort(a, a+n);

        //最短时间
        int mid = L/2, m;
        int p = lower_bound(a, a+n, mid)-a;
        if(abs(a[p]-mid)>abs(a[p-1]-mid))
            m = a[p-1];
        else m = a[p];
        int te = min(m, L-m);

        //最长时间
        int tl = max(L-a[0], a[n-1]);

        printf("%d %d\n", te, tl);
    }
    return 0;
}

方法二:
思路:
最短时间:每个蚂蚁均向其最近边缘前进,求出所有蚂蚁用时的最长时间。
最长时间:所有蚂蚁均向其最远边缘前进,求出所有蚂蚁用时的最长时间。
代码:

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

const int MAXN = 1000005;
const int inf = 1<<23;
int a[MAXN];
int main()
{
    int T;
    int L, n;
    int ans_max;
    int ans_min;

    cin >> T;
    while(T--)
    {
        ans_max = -inf;
        ans_min = -inf;
        scanf("%d%d",&L,&n);
        for(int i=0; i<n; i++)
        {
            cin >> a[i];
            ans_min = max(ans_min, min(a[i],L-a[i]));
            ans_max = max(ans_max, max(a[i],L-a[i]));
        }

        printf("%d %d\n", ans_min, ans_max);
    }
    return 0;
}
难度增加的抽签的抽签问题

参考博文:挑战程序设计竞赛:难度增加的抽签问题
注意点:

  • 复杂度降低的转化思路(用空间换时间):将一部分值提前计算出来存起来,然后减少两层循环,再用二分查找寻找值。
  • STL中提供了二分查找函数 binary_search(a,a+n,key)
  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值