P1007 独木桥
代码:
#include<bits/stdc++.h>
using namespace std;
int l,n,site;
int main()
{
int i,maxn=0,minn=0;
cin>>l>>n;
for(i=0;i<n;i++)
{
cin>>site;
maxn=max(maxn,max(l+1-site,site));
minn=max(minn,min(l+1-site,site));
}
cout<<minn<<' '<<maxn;
}
解析:
两人对撞时视为互相穿过,只要找出最中间的就行。
P1223 排队接水
代码:
#include<bits/stdc++.h>
using namespace std;
struct man
{
int num;
double time;
}a[1005];
int cmp(man a,man b)
{
return a.time<b.time;
}
int main()
{
int n;
cin>>n;
double sum_time=0,_time=0;
int i;
for(i=0;i<n;i++)
{
cin>>a[i].time;
a[i].num=i+1;
}
sort(a,a+n,cmp);
for(i=0;i<n;i++)
{
cout<<a[i].num;
sum_time+=a[i].time*(n-i-1);
if(i==n-1)
{
cout<<'\n';
}
else
{
cout<<' ';
//_time+=a[i+1].time;
//sum_time+=_time;
}
}
cout<<fixed<<setprecision(2)<<sum_time/n;
}
解析:
贪心法,结构体记录顺序。
P1803 凌乱的yyy / 线段覆盖
代码:
include<bits/stdc++.h>
using namespace std;
struct contest
{
int start;
int end;
}a[1000005];
int cmp(contest a,contest b)
{
return a.end<b.end;
}
int main()
{
int n,i,last=0,num=0;
cin>>n;
for(i=0;i<n;i++)
{
cin>>a[i].start>>a[i].end;
}
sort(a,a+n,cmp);
for(i=0;i<n;i++)
{
if(a[i].start>=last)
{
last=a[i].end;
num++;
}
}
cout<<num;
}
解析:
先根据开始时间排序,然后用贪心法
P1031 [NOIP2002 提高组] 均分纸牌
代码:
#include<bits/stdc++.h>
using namespace std;
int a[105];
int main()
{
int sum=0,i,step=0,ave,gap,n;
cin>>n;
for(i=0;i<n;i++)
{
cin>>a[i];
sum+=a[i];
}
ave=sum/n;
for(i=0;i<n;i++)
{
gap=a[i]-ave;
if(gap==0)
{
}
else
{
step++;
a[i+1]+=gap;
}
}
cout<<step;
}
解析:
贪心法,从最边上的纸牌开始向相邻的纸牌索取(变成负数也无所谓),不用索取就跳过,这样是最快方法。