poj1852
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int cases;
cin>>cases;
while(cases--)
{
int len,n;
cin>>len>>n;
int a[n];
for(int i=0;i<n;i++)
{
scanf("%d",a+i);
}
sort(a,a+n);
int maxn=-1;
int minn= -1;
for(int i=0;i<n;i++)
{
//所有蚂蚁都选择最长的路走,用时最长的是最大花费时间
maxn = max(maxn,max(a[i],len-a[i]));
//是因为所有蚂蚁都选择最短的路走,用时最长的是最小花费时间
minn = max(minn,min(a[i],len-a[i]));
}
cout<<minn<<" "<<maxn<<endl;
}
return 0;
}
顺便解决蚂蚁感冒那题。思路参考博客参考博客
#include<iostream>
#include<algorithm>
#define maxn 101
using namespace std;
struct node{
int p;//position
int d;//direction
int flag;//标记第一个感冒的人
}a[maxn];
struct rule{
bool operator()(const node& n1,const node& n2)
{
return n1.p<n2.p;
}
};
int main()
{
int n;
cin>>n;
//数据量小,直接用cin了
for(int i=0;i<n;i++)
{
int tmp;
cin>>tmp;
if(tmp<0)
a[i].d = -1;
else
a[i].d = 1;
a[i].p = a[i].d*tmp;
if(i==0)
a[i].flag = 1;
// else
// a[i].flag = 0;
}
sort(a,a+n,rule());
int gmindex=0;//感冒的蚂蚁的下标
int ltr=0;//left to right 从左边往右边走的
int rtl=0;//right to left 从右边往左边走的
int res=0;//result结果
// for(int i=0;i<n;i++)
// {
// cout<<a[i].p<<" "<<a[i].d<<" "<<a[i].flag<<endl;
// }
// cout<<"------------------------------------------"<<endl;
//计算ltr,知道碰到感冒的蚂蚁
for(int i=0;i<n;i++)
{
if(a[i].flag==1)
{
gmindex = i;
break;
}
if(a[i].d == 1)
ltr++;
}
//计算rtl
for(int i=gmindex+1;i<n;i++)
{
if(a[i].d == -1)
rtl++;
}
// cout<<ltr<<" "<<rtl<<endl;
// cout<<" -----------------"<<endl;
//如果感冒的蚂蚁朝向右边,而且从右往左(rtl)走的蚂蚁数量为0
//或者它朝向左边,而且从左边往右边(ltr)走的蚂蚁为0
//这两种情况感冒的蚂蚁一个都没感染到,所以结果为一(只有它自己感冒)
if((a[gmindex].d == 1 && rtl == 0) || (a[gmindex].d == -1 && ltr == 0))
res = 1;
else//否则它会感染它右边往左边走的和它左边往右边走的所有蚂蚁
res = ltr+rtl+1;
cout<<res<<endl;
return 0;
}