Topcoder SRM 648 Div.2 - A(水), B(枚举),C(DP/构造)
2015-02-03 16:55
405 查看
第一场TC~~ 一道题0.0 Fighting all the time!!
A. KitayutaMart2
水题~求一下公式即可,2^(n+1) = T/k+1.
CODE :
由于数据量很小,枚举两个删除点, 在dfs一下图,即可。
CODE;
Way1:DP: dp[i][j][k][num] = 第i个位置j个A,k个B得到num对。
Way2:构造。枚举N个A,N个B, N个C, 三个for, 直到(i×(j+k)+ j * k) == K 为止,可以连续输出A,B,C.
CODE :
A. KitayutaMart2
水题~求一下公式即可,2^(n+1) = T/k+1.
CODE :
#line 7 "KitayutaMart2.cpp" #include <cstdlib> #include <cctype> #include <cstring> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <string> #include <iostream> #include <sstream> #include <map> #include <set> #include <queue> #include <stack> #include <fstream> #include <numeric> #include <iomanip> #include <bitset> #include <list> #include <stdexcept> #include <functional> #include <utility> #include <ctime> using namespace std; #define PB push_back #define MP make_pair #define REP(i,n) for(i=0;i<(n);++i) #define FOR(i,l,h) for(i=(l);i<=(h);++i) #define FORD(i,h,l) for(i=(h);i>=(l);--i) typedef vector<int> VI; typedef vector<string> VS; typedef vector<double> VD; typedef long long LL; typedef pair<int,int> PII; class KitayutaMart2 { public: int numBought(int K, int T) { //$CARETPOSITION$ int x = T/K+1; int n = 0, s = 1; while(s < x) { s *= 2; n++; } return n; } };B.Fragile2
由于数据量很小,枚举两个删除点, 在dfs一下图,即可。
CODE;
#line 7 "Fragile2.cpp" #include <cstdlib> #include <cctype> #include <cstring> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <string> #include <iostream> #include <sstream> #include <map> #include <set> #include <queue> #include <stack> #include <fstream> #include <numeric> #include <iomanip> #include <bitset> #include <list> #include <stdexcept> #include <functional> #include <utility> #include <ctime> using namespace std; #define PB push_back #define MP make_pair #define REP(i,n) for(i=0;i<(n);++i) #define FOR(i,l,h) for(i=(l);i<=(h);++i) #define FORD(i,h,l) for(i=(h);i>=(l);--i) typedef vector<int> VI; typedef vector<string> VS; typedef vector<double> VD; typedef long long LL; typedef pair<int,int> PII; bool vis[55]; int gra[60][60], g[60][60]; int n; class Fragile2 { public: void init(VS graph) { for(int i = 0; i < n; ++i) { for(int j = 0; j < n; ++j) { if(graph[i][j] == 'Y') gra[i][j] = 1; else gra[i][j] = 0; } } } int dfs(int st) { for(int i = 0; i < n; ++i) { if(!vis[i] && g[st][i]) { vis[i] = 1; dfs(i); } } } int work(int x, int y) { memset(vis, 0, sizeof(vis)); for(int i = 0; i < n; ++i) { for(int j = 0; j < n; ++j) { g[i][j] = gra[i][j]; } } vis[x] = 1; vis[y] = 1; for(int i = 0; i < n; ++i) { g[x][i] = 0; g[i][x] = 0; g[y][i] = 0; g[i][y] = 0; } int cnt = 0; for(int i = 0; i < n; ++i) { if(!vis[i]) { vis[i] = 1; cnt++; dfs(i); } } return cnt; } int countPairs(vector <string> graph) { int ans = 0; n = graph.size(); memset(gra, 0, sizeof(gra)); memset(g, 0, sizeof(g)); init(graph); int sum = work(n, n); for(int i = 0; i < n; ++i) { for(int j = i + 1; j < n; ++j) { if(sum < work(i, j)) ans++; } } return ans; } };C.ABC
Way1:DP: dp[i][j][k][num] = 第i个位置j个A,k个B得到num对。
Way2:构造。枚举N个A,N个B, N个C, 三个for, 直到(i×(j+k)+ j * k) == K 为止,可以连续输出A,B,C.
CODE :
#line 7 "ABC.cpp" #include <cstdlib> #include <cctype> #include <cstring> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <string> #include <iostream> #include <sstream> #include <map> #include <set> #include <queue> #include <stack> #include <fstream> #include <numeric> #include <iomanip> #include <bitset> #include <list> #include <stdexcept> #include <functional> #include <utility> #include <ctime> using namespace std; short dp[32][35][35][500]; class ABC { public: string cal(int x) { switch(x){ case 0: return "A"; case 1: return "B"; case 2: return "C"; } } string createString(int N, int K) { memset(dp, -1, sizeof(dp)); dp[0][0][0][0] = 0; for(int i = 0; i < N; ++i) { for(int j = 0; j <= i; ++j) { for(int k = 0; k <= i; ++k) { if(j + k > i) continue; for(int num = 0; num <= max(min((i*(i-1))/2, K), 0); ++num) { if(dp[i][j][k][num] < 0) continue; //printf("%d %d %d %d\n", i, j, k, num); for(int op = 0; op < 3; ++op) { if(op == 0) dp[i+1][j+1][k][num+i-j] = op; else if(op == 1) dp[i+1][j][k+1][num+i-(j+k)] = op; else dp[i+1][j][k][num] = op; } } } } } string ans; int k = K; for(int i = 0; i <= N; ++i) { for(int j = 0; i+j <= N; ++j) { if(dp [i][j][k] >= 0) { while(N) { int d = dp [i][j][k]; string op = cal(d); ans += op; --N; if(d == 0) { --i; k -= (N-i); } else if(d == 1) { --j; k -= (N-i-j); } } return ans; } } } return ans; } };
相关文章推荐
- Topcoder SRM 648 (div.2)
- Topcoder srm 653 div.2 500 - RockPaperScissorsMagicEasy(DP)
- TopCoder SRM 677 Div. 2 550 - FourStrings (枚举)
- TopCoder SRM 633 Div.2 500 Jumping
- Topcoder SRM 637 (Div.2)
- TopCoder SRM 642 Div.2 1000 --二分+BFS
- TOPCODER_SRM580_DIV2_2---------枚举
- TopCoder SRM 648 Div2 Problem 1000 - ABC (DP)
- TOPCODER SRM 648 -AB
- Topcoder SRM 565 Div.2
- Topcoder SRM 636 Div2 1000(切蛋糕,最后一块给自己。最小值中求最大值,二分+枚举)
- Topcoder Srm 648 DIV1
- TopCoder SRM 634 Div.2[ABC]
- TopCoder SRM 645 Div2 Problem 500 - ConnectingCars (枚举)
- Topcoder SRM 721 Div.2 A. FlightDataRecorder
- TopCoder SRM 661 Div2 Problem 500 - BridgeBuildingDiv2 (枚举 + 状态压缩)
- TopCoder SRM 639 Div.2 500 AliceGameEasy
- Topcoder SRM 721 Div.2 B. RememberWordsEasy
- Topcoder SRM 721 Div.2 C. ApocalypseEasy
- 【topcoder第一弹】 SRM 144 Div.2 whatTime