題目大意:田忌的馬一定得比齊王的馬快才能贏,問n次比賽結束後田忌最多能贏多少錢!(注意:並不是同一等級的馬齊王一定比田忌快);
解題思路:貪心.
貪心的策略:
一、當田忌最快的馬比國王最快的馬快時,用田忌最快的馬贏國王最快的馬。
二、當田忌最快的馬比國王最快的馬慢時,用田忌最慢的馬輸給國王最快的馬。
三、當田忌最快的馬跟國王最快的馬一樣快時,分情況。
所以:對於情況三,我們應該從最慢的馬開始考慮了
1、當田忌最慢的馬比國王最慢的馬快,那麼用田忌最慢的馬贏國王最慢的馬
2、當田忌最慢的馬比國王最慢的馬慢,那麼用田忌最慢的馬輸給國王最快的馬
3、當田忌最慢的馬跟國王最慢的馬相等的時候,用田忌最慢的馬跟國王最快的馬比
倒過來思考也是一樣的。。。
代碼如下:
/*
* 1052_3.cpp
*
* Created on: 2013年8月10日
* Author: Administrator
*/
#include <iostream>
#include <algorithm>
bool compare(int a, int b) {
return a < b;
}
using namespace std;
int main() {
int n;
while (scanf("%d", &n) != EOF, n) {
int a[n], b[n];
int i, j;
for (i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
for (i = 0; i < n; ++i) {
scanf("%d", &b[i]);
}
sort(a, a + n);
sort(b, b + n);
int win = 0, kn = n;
for (i = 0, j = 0; i < n;) {
if (a[i] > b[j]) {
// printf("a[%d]=%d,b[%d]=%d\n",i,a[i],j,b[j]);
// cout<<"1"<<endl;
win++;
++i;
++j;
} else if (a[i] < b[j]) {
// cout<<"2"<<endl;
--win;
++i;
--kn;
} else {
// cout<<"3"<<endl;
if (a[n - 1] > b[kn - 1]) {
// cout<<"3_1"<<endl;
++win;
--n;
--kn;
} else if (a[n - 1] < b[kn - 1]) {
// cout<<"3_2"<<endl;
--win;
++i;
--kn;
} else if (a[n - 1] == b[kn - 1]) {
// cout<<"3_3"<<endl;
if (a[i] < b[kn - 1]) {
--win;
}
++i;
--kn;
}
}
}
printf("%d\n", win * 200);
}
}
/*
* 1052_3.cpp
*
* Created on: 2013年8月10日
* Author: Administrator
*/
#include <iostream>
#include <algorithm>
bool compare(int a, int b) {
return a < b;
}
using namespace std;
int main() {
int n;
while (scanf("%d", &n) != EOF, n) {
int a[n], b[n];
int i, j;
for (i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
for (i = 0; i < n; ++i) {
scanf("%d", &b[i]);
}
sort(a, a + n);
sort(b, b + n);
int win = 0, kn = n;
for (i = 0, j = 0; i < n;) {
if (a[i] > b[j]) {
// printf("a[%d]=%d,b[%d]=%d\n",i,a[i],j,b[j]);
// cout<<"1"<<endl;
win++;
++i;
++j;
} else if (a[i] < b[j]) {
// cout<<"2"<<endl;
--win;
++i;
--kn;
} else {
// cout<<"3"<<endl;
if (a[n - 1] > b[kn - 1]) {
// cout<<"3_1"<<endl;
++win;
--n;
--kn;
} else if (a[n - 1] < b[kn - 1]) {
// cout<<"3_2"<<endl;
--win;
++i;
--kn;
} else if (a[n - 1] == b[kn - 1]) {
// cout<<"3_3"<<endl;
if (a[i] < b[kn - 1]) {
--win;
}
++i;
--kn;
}
}
}
printf("%d\n", win * 200);
}
}
以上附上另外一篇博客的地址。算法都是一樣的。但他的代碼有注釋。在這裡我就懶得寫注釋了。。