贪心 ;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;
}