标签:
链接 :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; }
标签:
原文地址:http://blog.csdn.net/u013923947/article/details/45938277