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

被折叠的 条评论
为什么被折叠?



