Latest Entries »

撑过最难熬的日子

这一个月比起我人生中经历的那些不幸,算不得什么。但是我却前所未有的浮躁,ACM根本没机会放开了手脚去搞。只能是凭借之前的不错的状态维持着,索性校内排名比我预计的好很多,但我终归还是不能这样混沌下去。最后几天,真的要放下心来,认真做一做。
现在的浮躁主要还是表现在急功近利上,总想着挣钱,已经开始有强迫症的征兆了。不过也多亏这种心态,我才催生出一个做OJ的想法,征询同系的几个人,都表示有疑虑,不过整体认为还是有发展的可能的,至少目前没发现完全无法解决的问题。
说这几天难熬也正是因为这一点,如果为了这个想法而放弃近在咫尺的ACM,恐怕最后成功与否,我都不会原谅自己。
我知道,单纯对于那个项目的发展而言,我表现的比别人乐观得多,我想这也是老婆给我的一个很大的启示,无论如何,如果一个项目的发起人都不能使人信服,给人相信你的理由,谁又能让你相信呢?
不过对于细节的实施,还真是一点着落都没有,有的只是一些零零碎碎的想法,而且还要沉淀到ACM结束,我不知道还剩下什么,不过,为了挣点钱,我也没有什么能顾及的了。

关于ubuntu下中文输入法的安装

对于很多人,linux最不好的地方就是ubuntu的中文输入法,而且似乎不能从软件库中直接安装。
通过郭队介绍,找到一个很不错的中文输入法:sunpinyin
网上的安装教程很多,但是经过很长时间才找到一个很好的,非常简单。

http://pengjiayou.com/blog/ppa-for-installing-sunpinyin-on-ubuntu-910

很简单,不用涉及编译等操作会出现的问题。

ACM近感

期盼一个月的集训终于开始了,我却已经失去了之前的欣喜,当别人问起我回学校干什么的时候,若是以前,我肯定会很自豪地说,要ACM集训;可是现在,我已经厌倦于回答这个问题了,不是被问烦了,而是我现在已经没有之前的自信与轻狂了。大学的一年,的确消磨了我很多的斗志,不是缺乏逆境,也不是缺乏在逆境中思考的机会,只是每天总有各种或无聊或有聊的事情让我没时间去思考。我渐渐明白,鲁迅先生若是没有过《彷徨》,是无法重新《呐喊》的。我呢?也确实无力呐喊了。
很早的时候,就在OIBH中看到有人评价大学搞ACM的感觉:WA的打击越来越大,AC的喜悦越来越小。当时很是不解,觉得写代码就是在享受生活,怎么会沦落到这种地步?如今才算是体会到:道之所在,每况愈下。
第一天,效率感觉很低,只是在不停地刷网页,因为什么都打不开,一整天没有一个正确提交,这就是我第一天的状态,至于以后我该怎么办,还真没想过,但我至少现在看开了,ACM或许更好玩,但我恐怕已经找不到当年oi的激情了,我也不会特别在意,只当是一次简单的经历吧,或许这样,我才能离ACM更近

情侣blog昨日正式上架

接受老婆命令,把我俩的小空间做好了,上传了。地址还是不公开了,毕竟那是只属于我俩的小地方。
这也算是我第一个web作品,确实不太难,很多东西,尤其是php都是能够直接找代码的。整体感觉,没什么技术含量,但通过这个,我认识到子骅推荐的w3cschool的确是个不错的网站,很基础,不冗余,非常适合入门。
至于关于php的东西,我也只是懂了一点基础的东西。
整体的一个概念就是,php文件就相当于一个原文件,由服务器编译它,生成一个html文件回馈给我们,所以,我们只能看到一个静态的html,其中是看不到php原文件的,浏览器也不能直接运行php。但是js能展示一些动态效果。它和html是能够直接被浏览器识别并且展示出来的。
昨天又申请了一个Adsense,不知道为什么没通过审核。改天接着试吧。

poj1112

这道题第一次见到还是在南京大学出版社的紫书上看到的,当时只记得这道题解释非常简单,所以没看懂,怎样也无法把它看成一道dp题目,其实这道题如果一开始就按dp来想,可肯定无从下手。
看到这道题,第一感觉就是图论,毫无疑问,不过这道题的精妙之处在于构建反图,对于有些时候需要考虑两两之间都联通的时候,就要考虑其反图可能会很简单。
求出反图之后,我有一个错误的认识,对于反图中的连通分量,一定可以划分成恰好数量相等的两个集合,使得每个集合中结点互不连通,但在结题报告中看到,这显然是错误的,不过“恰好两个集合”是没问题的。
下面要做的就是用dp把每个连通分量中的两个集合分别相加,使数量差最小。这一点不难。
下面贴代码,依旧很丑。

#include 
using 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");
}
Powered by WordPress | Theme: Motion by 85ideas.