链接 :
http://acm.hdu.edu.cn/search.php?field=problem&key=BestCoder+Round+%2342&source=1&searchmode=source
第一题 : 水题。
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <stack>
#include <cmath>
#include <queue>
#include <map>
#include <set>
#define lson o<<1,l,m
#define rson o<<1|1,m+1,r
#define mem(a) memset(a,0,sizeof(a))
typedef __int64 ll;
const int N = 1000005;
const int M = 10005;
const ll mod = 1000000007;
const double PI = acos(-1.0);
using namespace std;
int n;
int a[40][40];
int main() {
// freopen("in.txt", "r", stdin);
while(cin >> n) {
int cnt = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
cin >> a[i][j];
if(a[i][j]) cnt++;
}
}
int ans = 2 * n + cnt;
cout << ans << endl;
}
return 0;
}
第二题 : 分别对树的高度 和 查询的高度排序。然后对于每个查询高度从小到大扫描 遇到相等的树的高度就记录id (最后输出要按照原序)
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <stack>
#include <cmath>
#include <queue>
#include <map>
#include <set>
#define lson o<<1,l,m
#define rson o<<1|1,m+1,r
#define mem(a) memset(a,0,sizeof(a))
typedef __int64 ll;
const int N = 100005;
const int M = 10005;
const ll mod = 1000000007;
const double PI = acos(-1.0);
using namespace std;
int n, m;
struct C {
int h, id;
} a[N], q[N];
int ans[N];
bool cmp(C x, C y) {
if(x.h != y.h) return x.h < y.h;
return x.id < y.id;
}
int main() {
// freopen("in.txt", "r", stdin);
while(cin >> n >> m) {
for(int i = 0; i < n; i++) {
scanf("%d", &a[i].h);
a[i].id = i;
}
sort(a, a+n, cmp);
for(int i = 0; i < m; i++) {
scanf("%d", &q[i].h);
q[i].id = i;
}
sort(q, q+m, cmp);
int p = 0;
for(int i = 0; i < m; i++) {
while(a[p].h < q[i].h && p < n-1) p++;
if(a[p].h == q[i].h) {
ans[q[i].id] = a[p].id+1;
p++;
//printf("%d", a[p].id+1);
} else {
//printf("-1");
ans[q[i].id] = -1;
}
//puts("");
}
for(int i = 0; i < m; i++) {
printf("%d\n", ans[i]);
}
}
return 0;
}
第三题 : 01背包 判断当前dp[][][k] 是否可达 k 代表当前的价值。
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <stack>
#include <cmath>
#include <queue>
#include <map>
#include <set>
#define lson o<<1,l,m
#define rson o<<1|1,m+1,r
#define mem(a) memset(a,0,sizeof(a))
typedef __int64 ll;
const int N = 100005;
const int M = 10005;
const ll mod = 1000000007;
const double PI = acos(-1.0);
using namespace std;
int n, m, k;
int a[110][110];
int f[110][110][110];
int main()
{
while(~scanf("%d %d %d", &n, &m, &k)) {
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
scanf("%d", &a[i][j]);
mem(f);
f[0][1][0] = f[1][0][0] = 1;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
for(int p = 0; p <= k; p++) {
f[i][j][p] |= f[i-1][j][p] | f[i][j-1][p];
if(p >= a[i][j]) f[i][j][p] |= f[i-1][j][p-a[i][j]] | f[i][j-1][p - a[i][j]];
}
}
}
int ans = 0;
for(int i = k; i >= 0; i--)
if(f[n][m][i]) {
ans = i;
break;
}
cout << ans << endl;
}
return 0;
}