三道动归基础。。。
P1255
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,a[120];
int fs[120],fe[120];
int main()
{
memset(a,0,sizeof(a));
memset(fs,0,sizeof(fs));
memset(fe,0,sizeof(fe));
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)//fs头到末
{
for(int j=0;j<i;j++)
if(a[i]>a[j]&&fs[i]<fs[j])
fs[i]=fs[j];
fs[i]++;
}
for(int i=n;i>=1;i--)//fe未到头
{
for(int j=n+1;j>i;j--)
if(a[i]>a[j]&&fe[i]<fe[j])
fe[i]=fe[j];
fe[i]++;
}
int minn=200000;
for(int i=1;i<=n;i++)//因为fs和fe是从头到尾和从未到头的方案所以temp=n-fs-fe就表示剩余的数目及出列的人数
{
int temp=n-fs[i]-fe[i]+1;
if(temp<minn)
minn=temp;
}
printf("%d\n",minn);
return 0;
}
P1256
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int ans=0,f[5100];
int n,s;
struct kkk
{
int x,y,t;
}apples[5100];
bool cmp(kkk a,kkk b)
{
return (a.t<b.t);
}
double dis(int k,int h)
{
double temp=sqrt(1.0*(apples[k].x-apples[h].x)*(apples[k].x-apples[h].x)+1.0*(apples[k].y-apples[h].y)*(apples[k].y-apples[h].y));
return temp;
}
void work()
{
sort(apples+1,apples+1+n,cmp);//以时间排序
memset(f,-1,sizeof(f));//复位不合法
f[0]=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<i;j++)
if((f[j]>=0)&&((apples[i].t-apples[j].t)*s>=dis(i,j)))//合法且在时间内能到达
f[i]=max(f[i],f[j]+1);
ans=max(ans,f[i]);
}
printf("%d\n",ans);
}
int main()
{
scanf("%d%d",&n,&s);
for(int i=1;i<=n;i++)
scanf("%d%d%d",&apples[i].x,&apples[i].y,&apples[i].t);
work();
return 0;
}
注意distance是关键字
浙公网安备 33010602011771号