本题明显是dp,用贪心的思想,肯定要走最多的捷径,所以dp[i]表示到达当前捷径之前最多的捷径数状态方程为dp[i]=max(dp[i],dp[j]+1),之前还要排序处理一下,接着就是蛋疼的精度,wa了几次,最后要记得用floor(ans+0.5)处理一下。
上代码:
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <string.h>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <limits.h>
using namespace std;
int lowbit(int t){return t&(-t);}
int countbit(int t){return (t==0)?0:(1+countbit(t&(t-1)));}
int gcd(int a,int b){return (b==0)?a:gcd(b,a%b);}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a>b?b:a;}
#define LL __int64
#define pi acos(-1)
#define N 100010
#define INF INT_MAX
#define eps 1e-8
struct node
{
int x;int y;
bool operator<(node b)const
{
if(x!=b.x)return x<b.x;
return y<b.y;
}
}p[110];
int dp[110];
int main()
{
//freopen("a.txt","r",stdin);
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int i,j;
int k;
scanf("%d",&k);
if(!k)
{
printf("%d\n",100*(n+m));
continue;
}
for(i=0;i<k;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
dp[i]=0;
}
sort(p,p+k);
int cnt=1;
dp[0]=1;
for(i=1;i<k;i++)
{
dp[i]=1;
for(j=0;j<i;j++)
{
if(p[i].x>p[j].x && p[i].y>p[j].y)
dp[i]=max(dp[i],dp[j]+1);
}
cnt=max(cnt,dp[i]);
}//printf("!%d\n",cnt);
double an=(n+m-2*cnt+sqrt(2.0)*cnt)*100;
int ans=floor(an+0.5);//返回<=指定表达式的最大整数
printf("%d\n",ans);
}
return 0;
}
392

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



