田忌賽馬 poj 2287 (貪心,動態規劃,貪心+動態規劃)
阿新 • • 發佈:2018-12-31
貪心 ;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; }