田忌赛马 poj 2287 (贪心,动态规划,贪心+动态规划)

16 篇文章 0 订阅

      题目链接


贪心 ;1:如果田忌的最快马快于齐王的最快马,比一场

           2: 如果田忌的最快马慢于齐王的最快马,则用田忌的最慢马和齐王的最快马比赛一场

          3: 如果田忌的最快马和齐王的最快马一样快,则比较田忌的最慢马和齐王的最慢马分两种情况

          (1) 若田忌的最慢马快于齐王的最慢马,田忌的慢马和齐王的慢马进行比较

           (2 ) 否则就拿田忌的最慢马和齐王的最慢快马比


 

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<ctype.h>
    #include<math.h>
    #include<stack>
    #include<queue>
    #include<map>
    #include<set>
    #include<vector>
    #include<string>
    #include<iostream>
    #include<algorithm>
    #include<utility>
    #include<iomanip>
    #include<time.h>
    typedef long long ll;
    const double Pi = acos(-1.0);
    const int N = 1e6+10, M = 1e3+20, mod = 1e9+7, inf = 2e9+10;
    const double e=2.718281828459 ;
    const double esp=1e-9;
    using namespace std;
    int n;
    int a[M],b[M];

    int  main()
    {
        while(~scanf("%d",&n)&&n)
        {
            for(int i=0; i<n; i++)
                scanf("%d",&a[i]);
            for(int i=0; i<n; i++)
                scanf("%d",&b[i]);
            sort(a,a+n);
            sort(b,b+n);
            int min1=0,min2=0;
            int max1=n-1,max2=n-1;
            int sum=0;
            while(n--)
            {
                if(a[max1]>b[max2])
                {
                    sum+=200;
                    max1--;
                    max2--;
                }
                else if(a[max1]<b[max2])
                {
                    sum-=200;
                    min1++;
                    max2--;
                }
                else
                {
                    if(a[min1]>b[min2])
                    {
                        sum+=200;
                        min1++;
                        min2++;
                    }
                    else if(a[min1]<b[max2])
                    {

                        sum-=200;
                        min1++;
                        max2--;
                    }
                }
            }
            printf("%d\n",sum);
        }
        return 0;
    }


动态规划:



代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#include<math.h>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<string>
#include<iostream>
#include<algorithm>
#include<utility>
#include<iomanip>
#include<time.h>
typedef long long ll;
const double Pi = acos(-1.0);
const int N = 1e6+10, M = 1e3+20, mod = 1e9+7, inf = 2e9+10;
const double e=2.718281828459 ;
const double esp=1e-9;
using namespace std;
int n;
int a[M],b[M];
int f[M][M];
int S(int i,int j)
{
    if(a[i]>b[j]) return 1;
    else if(a[i]<b[j]) return -1;
    else return 0;
}
int  main()
{
    while(~scanf("%d",&n)&&n)
    {
        for(int i=1; i<=n; i++)
            scanf("%d",&a[i]);
        for(int i=1; i<=n; i++)
            scanf("%d",&b[i]);
        sort(a+1,a+n+1,greater<int>());
        sort(b+1,b+n+1,greater<int>());
        memset(f,-100,sizeof(f));
        f[0][0]=0;
        for(int i=1; i<=n; i++)
        {
            for(int j=0; j<=n; j++)
            {
                if(j==0)
                    f[i][j]=max(f[i][j],f[i-1][j]+S(i-j,i));
                else
                    f[i][j]=max((f[i-1][j-1]+S(n-j+1,i)),(f[i-1][j]+S(i-j,i)));
            }
        }
        int maxn=f[n][0];
        for(int i=1; i<=n; i++)
        {
            maxn=max(maxn,f[n][i]);
        }
        printf("%d\n",maxn*200);
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值