这一个月比起我人生中经历的那些不幸,算不得什么。但是我却前所未有的浮躁,ACM根本没机会放开了手脚去搞。只能是凭借之前的不错的状态维持着,索性校内排名比我预计的好很多,但我终归还是不能这样混沌下去。最后几天,真的要放下心来,认真做一做。
现在的浮躁主要还是表现在急功近利上,总想着挣钱,已经开始有强迫症的征兆了。不过也多亏这种心态,我才催生出一个做OJ的想法,征询同系的几个人,都表示有疑虑,不过整体认为还是有发展的可能的,至少目前没发现完全无法解决的问题。
说这几天难熬也正是因为这一点,如果为了这个想法而放弃近在咫尺的ACM,恐怕最后成功与否,我都不会原谅自己。
我知道,单纯对于那个项目的发展而言,我表现的比别人乐观得多,我想这也是老婆给我的一个很大的启示,无论如何,如果一个项目的发起人都不能使人信服,给人相信你的理由,谁又能让你相信呢?
不过对于细节的实施,还真是一点着落都没有,有的只是一些零零碎碎的想法,而且还要沉淀到ACM结束,我不知道还剩下什么,不过,为了挣点钱,我也没有什么能顾及的了。
Latest Entries »
期盼一个月的集训终于开始了,我却已经失去了之前的欣喜,当别人问起我回学校干什么的时候,若是以前,我肯定会很自豪地说,要ACM集训;可是现在,我已经厌倦于回答这个问题了,不是被问烦了,而是我现在已经没有之前的自信与轻狂了。大学的一年,的确消磨了我很多的斗志,不是缺乏逆境,也不是缺乏在逆境中思考的机会,只是每天总有各种或无聊或有聊的事情让我没时间去思考。我渐渐明白,鲁迅先生若是没有过《彷徨》,是无法重新《呐喊》的。我呢?也确实无力呐喊了。
很早的时候,就在OIBH中看到有人评价大学搞ACM的感觉:WA的打击越来越大,AC的喜悦越来越小。当时很是不解,觉得写代码就是在享受生活,怎么会沦落到这种地步?如今才算是体会到:道之所在,每况愈下。
第一天,效率感觉很低,只是在不停地刷网页,因为什么都打不开,一整天没有一个正确提交,这就是我第一天的状态,至于以后我该怎么办,还真没想过,但我至少现在看开了,ACM或许更好玩,但我恐怕已经找不到当年oi的激情了,我也不会特别在意,只当是一次简单的经历吧,或许这样,我才能离ACM更近
接受老婆命令,把我俩的小空间做好了,上传了。地址还是不公开了,毕竟那是只属于我俩的小地方。
这也算是我第一个web作品,确实不太难,很多东西,尤其是php都是能够直接找代码的。整体感觉,没什么技术含量,但通过这个,我认识到子骅推荐的w3cschool的确是个不错的网站,很基础,不冗余,非常适合入门。
至于关于php的东西,我也只是懂了一点基础的东西。
整体的一个概念就是,php文件就相当于一个原文件,由服务器编译它,生成一个html文件回馈给我们,所以,我们只能看到一个静态的html,其中是看不到php原文件的,浏览器也不能直接运行php。但是js能展示一些动态效果。它和html是能够直接被浏览器识别并且展示出来的。
昨天又申请了一个Adsense,不知道为什么没通过审核。改天接着试吧。
这道题第一次见到还是在南京大学出版社的紫书上看到的,当时只记得这道题解释非常简单,所以没看懂,怎样也无法把它看成一道dp题目,其实这道题如果一开始就按dp来想,可肯定无从下手。
看到这道题,第一感觉就是图论,毫无疑问,不过这道题的精妙之处在于构建反图,对于有些时候需要考虑两两之间都联通的时候,就要考虑其反图可能会很简单。
求出反图之后,我有一个错误的认识,对于反图中的连通分量,一定可以划分成恰好数量相等的两个集合,使得每个集合中结点互不连通,但在结题报告中看到,这显然是错误的,不过“恰好两个集合”是没问题的。
下面要做的就是用dp把每个连通分量中的两个集合分别相加,使数量差最小。这一点不难。
下面贴代码,依旧很丑。
#includeusing namespace std; int n, i, x, j; bool map[101][101], t[101][101], noSolution = false, f[101][301]; int g[101][301], a[101],w[101], mark[101], root[101]; static int m; void makeMark( int x, int w ) { int i; mark[x] = w; root[x] = m; a[m] += w; for ( i = 1; i <= n; ++i ) { if ( i == x ) continue; if ( map[i][x] && mark[i] == mark[x] ) { noSolution = true; return; } if ( map[i][x] && mark[i] == 0 ) { makeMark(i, -w); if ( noSolution ) return; } } } int main() { memset( map, 0, sizeof(map)); memset( f, 0, sizeof(f)); memset( g, 0, sizeof(g)); memset( t, 0, sizeof(t)); memset( mark, 0, sizeof(mark)); scanf( "%d", &n ); for ( i = 1; i <= n; ++i ) { while ( true ) { scanf( "%d", &x ); if ( x == 0 ) break; t[i][x] = true; } }// read data for ( i = 1; i <= n; ++i ) for ( j = 1; j <= n; ++j ) { if ( t[i][j] && t[j][i] ) map[i][j] = map[j][i] = false; else map[i][j] = map[j][i] = true; }// make opposed graph m = 0; for ( i = 1; i <= n; ++i ) if ( mark[i] == 0 ) { m++; makeMark( i, 1 ); if ( noSolution ) { printf( "No solution" ); return 0; } } f[0][100] = true; for ( i = 1; i <= m; ++i ) for( j = -100; j <= 100; ++j ) { if ( f[i-1][j-a[i] + 100] ) { g[i][j+100] = -1; f[i][j+100] = true; } else if ( f[i-1][j+a[i]+100] ) { g[i][j+100] = 1; f[i][j+100] = true; } } int ans = 100; for ( i = -100; i < 100; ++i ) if ( abs(i) < abs(ans) && f[m][i+100] ) ans = i; int t = ans; for ( i = m; i >= 1; --i ) { w[i] = g[i][t+100]; t = t + g[i][t+100]*a[i]; } int Ans = 0; for ( i = 1; i <= n; ++i ) if ( w[root[i]] == mark[i] ) ++Ans; printf( "%d", Ans ); for ( i = 1; i <= n; ++i ) if ( w[root[i]] == mark[i] ) printf( " %d", i ); printf( "\n" ); Ans = 0; for ( i = 1; i <= n; ++i ) if ( w[root[i]] != mark[i] ) ++Ans; printf( "%d", Ans ); for ( i = 1; i <= n; ++i ) if ( w[root[i]] != mark[i] ) printf( " %d", i ); printf( "\n" ); system("pause"); }
