2017年 10 月 9 日 机房模拟赛
来源:互联网 发布:文明网络标语 编辑:程序博客网 时间:2024/06/05 07:02
T1是背包问题,但是我不知道正解(正解是状态巧妙的背包问题)
#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int MAXN = 2000 + 100;int N, M, dp[ MAXN + 10 ], tail;struct P { int w, a, b; } p[ MAXN + 10 ];bool cmp( const P &A, const P &B ) { return A.w < B.w; }int main( ) { freopen( "birthday.in", "r", stdin ); freopen( "birthday.out", "w", stdout ); scanf( "%d%d", &N, &M ); for( register int i = 1; i <= N; i++ ) scanf( "%d%d%d", &p[i].w, &p[i].a, &p[i].b ); for( register int i = 1; i <= N; i++ ) { for( register int j = M; j >= 1; j-- ) { if( p[i].w > j ) break; int up = j / p[i].w; int tmp = 0; for( register int k = 1; k <= up; k++ ) tmp = max( tmp, dp[ j - p[i].w * k ] + p[i].a * k ); dp[j] = max( dp[j], tmp + p[i].b ); } } printf( "%d\n", dp[M] ); return 0;}
T2裸状压,然而我发现我根本不会状压,这道题我们先把所有单层合法状态枚举出来,然后再进行每一层的DFS,然后统计次数
dfs过程中判断掉错误情况continue掉即可
#include <cstdio>#include <cstring>#include <algorithm>using namespace std ;const int mod = 100000000 ;int Lim, N, M, mp[15][15], lim[15], dp[15][ 1 << 14 ], situ[ 1 << 14 ], top;int Dfs( int pos, int t ) { if( pos == N + 1 ) return 1; if( dp[pos][t] != -1 ) return dp[pos][t]; int tmp = 0; for( register int i = 1; i <= top; i++ ) { if( situ[i] & lim[pos] ) continue; if( situ[i] & t ) continue; tmp = ( tmp + Dfs( pos + 1, situ[i] ) ) % mod; } return dp[pos][t] = tmp;}void dfs( int pos, int t ) { if( pos == M + 1 ) { situ[++top] = t; return; } if( pos == 1 || ( t & ( 1 << ( pos - 2 ) ) ) == 0 ) dfs( pos + 1, t + ( 1 << ( pos - 1 ) ) ); dfs( pos + 1, t );}int main( ) { freopen( "chess.in", "r", stdin ); freopen( "chess.out", "w", stdout ); scanf( "%d%d", &N, &M ); Lim = ( 1 << M ) - 1; dfs( 1, 0 ); for( register int i = 1; i <= N; i++ ) for( register int j = 1; j <= M; j++ ) { scanf( "%d", &mp[i][j] ); if( !mp[i][j] ) lim[i] |= ( 1 << ( j - 1 ) ); } memset( dp, -1, sizeof(dp) ); dp[0][0] = 1; printf( "%d", Dfs( 1, 0 ) ); return 0;}
T3是单调栈,我们维护几个数组分别表示从这一行中每个点最多能到的左边的位置从这一行中这个点最多能到的右边的位置,过程中我们维护单调栈即可,哇好难啊我根本不会啊,今天好多人AK了,而且是考了一个小时就已经AK之后无所事事了,还写了好多种其他方法的AK大佬,永远不可及了w…
#include <cstdio>#include <cstring>#include <algorithm>using namespace std ;int up[1005][1005] , mp[1005][1005] ;int N , M , SL[1005] , SR[1005] , maxn , L[1005] , R[1005] , top ;void solve( ) { for( register int i = 1; i <= N; i++ ) { memset( L, 0, sizeof( L ) );//L是左边的栈,R是右边的栈 top = 0; for( register int j = 1 ; j <= M; j++ ) { while( top && up[i][ L[top] ] >= up[i][j] ) top--; SL[j] = L[top] + 1; L[ ++top ] = j;//SL表示i这一行 } memset( R, 0, sizeof( R ) ); top = 0; R[0] = M + 1; for( register int j = M; j; j-- ) { while( top && up[i][ R[top] ] >= up[i][j] ) top--; SR[j] = R[top] - 1; R[++top] = j; } for( register int j = 1; j <= M; j++ ) maxn = max( maxn, ( SR[j] - SL[j] + 1 ) * up[i][j] ); } printf( "%d", maxn );}int main( ) { freopen( "question.in", "r", stdin ); freopen( "question.out", "w", stdout ); scanf( "%d%d", &N, &M ); for( register int i = 1; i <= N; i++ ) for( register int j = 1; j <= M; j++ ) { scanf( "%d", &mp[i][j] ); if( mp[i][j]) up[i][j] = up[ i - 1 ][j] + 1; } solve(); return 0;}
T4直接拓扑排序然后计算一下,注意有负数,然后还有一种方法是把超级源连向所有入度为0的点,把所有出度为0的点连向超级汇,然后跑一边最短路即可
#include <cstdio>#include <cstring>#include <iostream>#include <queue>using namespace std;const int MAXN = 2000000 + 10;int head[MAXN], tail, in[MAXN], out[MAXN], n, m;long long ans[MAXN], a[MAXN];struct Line{ int to, nxt; }line[ MAXN * 2 ];void add_line( int from, int to ) { line[++tail].nxt = head[from]; line[tail].to = to; head[from] = tail; out[from]++; in[to]++;}void solve( ) { long long ass = -214748123LL; for( register int i = 1; i <= n; i++ ) ans[i] = -214748123LL; queue<int>q; while( !q.empty() ) q.pop(); for( register int i = 1; i <= n; i++ ) if( in[i] == 0 ) { q.push( i ); ans[i] = a[i]; } while( !q.empty() ){ int u = q.front(); q.pop(); for( register int i = head[u]; i; i = line[i].nxt ) { int v = line[i].to; ans[v] = max( ans[v], ans[u] + a[v] ); in[v]--; if( in[v] == 0 ) q.push(v); } } for( register int i = 1; i <= n; i++ ) if( out[i] == 0 ) ass = max( ass, ans[i] ); printf( "%I64d\n", ass );}int main( ) { freopen( "road.in", "r", stdin ); freopen( "road.out", "w", stdout ); scanf( "%d%d", &n, &m ); for( register int i = 1; i <= n; i++ ) scanf( "%I64d", &a[i] ); for( register int i = 1; i <= m; i++ ) { int ff, tt; scanf( "%d%d", &ff, &tt ); add_line( ff, tt ); } solve(); return 0;}
阅读全文
0 0
- 2017年 10 月 9 日 机房模拟赛
- 2017年9月2日 机房模拟赛
- 机房模拟赛 2017年9月26日 数据结构
- 机房模拟赛 2017年9月27日
- 2017年8月30日 机房模拟赛题解
- 9月30日机房模拟赛题解
- 2017年6月30日 在5427机房
- 2015年9月12日模拟赛总结
- 机房训练赛 4月6日 (数论)
- 2017.9.10 机房模拟赛
- 2017年9月25日--10月1日(5小时,剩2888小时)
- 10月9日
- 9月10日
- 10月9日
- 9月10日
- 9月10日
- 2007年10月1日(9月29日,9月30日没写)
- 2017年8月18日模拟9(smoj2218、2044、2103,动态规划,动态规划、树链剖分)
- QT
- jenkins 使用git仓库部署 报错:jenkins Error performing command: git ls-remote -h
- 谷歌分布式计算框架MapReduce论文2004 中文翻译
- Keras深度学习模型可视化
- Java锁
- 2017年 10 月 9 日 机房模拟赛
- 264. Ugly Number II
- [HNOI2004]敲砖块
- 求1 到 n 的阶乘之和,n由键盘输入。
- Problem Occurred 'Starting Tomcat v7.0 Server at localhost' has encountered a problem. Server Tomc
- POJ-1753 Flip Game(翻棋子)
- hdu1530-回溯&最大团&菜鸟算法笔记-Maximum Clique
- 【BigHereo 22】---DataStructure---宏观理论(一)
- go 中 make 与 new 的区别