岁月就像一条河,

左岸是无法忘却的隐隐忧伤,

右岸是值得把握的青春年华,

中间飞快流淌的,是我们成长中最美好的记忆。

2006-10-31,我在百度空间安了家。

到现在,我已经拥有105个好友,有110人关注了我。一共有40506人访问了我的主页!

2006-10-31,我学会了上传照片,看这是我的第一张照片,到现在我已经传了1179张照片。

58662bdb84259a66d1164ee2

2006-10-31,我发表了第一篇文章:《百度空间与新浪博客的区别》

2008-02-21,我收到了第一条留言,到现在已经有48条留言。

不知不觉,du掌柜告诉我她5岁了,我才意识到自己在百度空间已经走过了1719个日日夜夜。

在这里发生的点点滴滴,都是我永远珍藏的记忆~。

lmm333写于2011-7-16

本博客来自于空间五周年活动


poj终于300了。

 

从200到300,花了多达8个月。

 

这八个月里:

 

第一个月(12月):迎接新年

shangke7788以新大一学学生身份听了ACM宣讲会。

我虽然没有在宣讲会上台讲话,但是以老队员的身份坐在台下,做了少许幕后工作。

 

第二个月(1月):期末

shangke7788切掉了poj的第一题。

为准备期末考试,我中断poj的刷题进度。

 

第三个月(2月):寒假

shangke7788以每天10题的进度高速前进。

 

我忽视了鱼头刷到300的要求,沉迷于php,申请免费空间,搭建自己的独立博客,同时尝试用php做了njust poj real time rank,动态显示同学们进步退步等情况,不要再麻烦地手动统计。寒假结束,real time rank做出来了,在那上面,我自己却以240题排在末位。

 

第四个月(3月):开学

shangke7788降到平均每天5题。

免费空间被黑掉之后,poj rank挂到njustoj beta 的服务器上,因为没有v4地址,只能ipv6访问。服务器很老(05年的PC),rank和oj一样效率地下,打开页面极为缓慢。

 

第五个月(4月):上半学期

shangke778的快速进步引起重视,提前进队了。

我的java课程设计作业做了njustoj contest rating,算法完全抄袭topcoder,通过oj开放的web服务获得比赛结果,算是对oj开放平台plugin功能的一个小测试。做好后没有及时重构,代码质量糟糕,现在已经很难维护。

ps:oj的核心成员teenager利用java课程设计做了njustoj分布式节点,实现了windows和linux下的判题节点与服务器的交互。

 

第六个月(5月):下半学期,各种比赛

shangke7788不到2个小时就切掉了校赛的4道水题,后来卡在一道数据有问题的题目上。最终排名第五。

我依靠贴模版过了第5题,罚时多5分钟,最终校赛第四,挽救了“长期不给力”表现下差的被踢出队境地,不过,复旦邀请赛是没机会的。趁机参加了njfu,nju,njupt的校赛,各种被虐。

ps:teenager发布了oj的ajax版本,美观与效率都有了很大提高

 

第七个月(6月):期末

shangke7788在240的数量停止刷题,开始复习迎考。

我利用.net课程设计的机会做了njust summer training automation system,重写了poj real time rank,整合了contest rating,后来集训开始又临时加上了签到、讲题等功能。由于赶工期、服务器暂时不能连外网、plugin管理功能没做好等因素,反馈不咋样,恶评如潮。

 

第八个月(7月):暑期集训开始

shangke已经330题,完全超越了我,而且我也追不上他的前进的脚步。

我在训练赛中表现不佳,除了倒数第一,其他末位的名次几乎拿全了。

 

 

总结:

本来有很好的机会,可是大好的时光浪费了。被学弟轻松超越,现在单挑,我已然不是对手。

马上就要大三了,我什么都不会,regional的机会也显得越来越渺茫。

工程方面,和teenager差距太大,完全不能参与核心的开发,只能乱搞点插件。

 

哎,我也不想这样。

 

可是一切毁在自己手上,又能怨谁呢?

 

这个暑假,心情一直不好,憋了好久,说出来希望能好受些。

 

望各位神牛给予迷惘中的我一些帮助,给点切实的建议把。


这两天做了一些简单背包问题,竟然5道里面卡了4道。

今晚终于在友人的帮助下过了一道,是个2b错误,贴出来晒晒,明天继续搞后面几道,看看错误到底在哪里,到时候再来更新。

(1)

#include<cstdio>#include<cstdlib>#include<cstring>usingnamespace std;#define max(x,y) ((x) > (y) ? (x) : (y))#define bagSize 200010#define bagNum 15int dp[bagSize], N, VOLUMN, value[bagNum], weight[bagNum], amount[bagNum];int DAY, interset;int main() { int i, j; int T; scanf("%d", &T); while (T--) { scanf("%d%d%d", &VOLUMN, &DAY, &N); VOLUMN /= 1000; interset = 0; memset(dp, 0, sizeof (dp)); for (i = 1; i <= N; i++) { scanf("%d%d", weight + i, value + i); weight[i] /= 1000; } while (DAY--) { for (int i = 1; i <= N; ++i) { //CompletePack(weight[i], value[i]);for (int j = weight[i]; j <= (VOLUMN + interset / 1000); ++j) { dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); } } interset += dp[VOLUMN + interset / 1000]; } printf("%d\n", VOLUMN * 1000 + interset); } return0;}
本高亮代码使用codeHl生成,查看详情

 

这个代码高亮怎么不灵了?哎

 

把VOLUMN换成VOLUMN * 1000就可以ac了

原因,题目说The value of a bond is always a multiple of $1 000,但是一开始给的总钱不一定是1000倍数啊,除1000乘1000,wa了一下午,伤不起啊。

 

(2)上午做了一场练习赛,大部分结对都是4、5题啊,我们4题,比赛12点结束,我们实现了线段树,然后交题,

最近的二b错误汇总 - 橙衣少年 - 跟着我勇敢地走下去

这就是提交情况,第一次ce了,然后加头文件,然后再交,接着交错代码了,发现之后重交 ,ac了,可惜比赛结束了。。。

 

(3)一道2分水题,三十几次提交终于ac,犯了各种错误

其中,最大的错误是:

while (scanf("%d%d", &n, &k),n&&k),n==k==0时退出 

改成while (scanf("%d%d", &n, &k),n||k) 

 

输入用%f错

输出用%lf错

 

精度不够错

。。。 。。。

我真的是沙茶


平时只把数据库作为存储数据的工具,都是读出所有数据,然后再处理。这种把业务逻辑封装在程序中的方法可移植性比较好。

今天,为了快速实现oj暑期训练的一些功能,直接用gridview显示数据,要写若干查询语句,我竟然百度了好久才完成。整理一下资料放在这里,减少以后重构的时间。

 

查询语句顺序:

select...from...where...group by...having...order by...

执行顺序:

from...where...group by ...having...select...order by...

 

//查询今天签到的同学

select true_name from sign_in Where DATE_FORMAT((datetime),'%Y-%m-%d') = DATE_FORMAT(NOW(),'%Y-%m-%d') group by true_name

 

//查询今天没签到的同学(使用子查询)

select true_name from user where status=0 and true_name not in(select true_name from sign_in Where DATE_FORMAT((datetime),'%Y-%m-%d') = DATE_FORMAT(NOW(),'%Y-%m-%d') group by true_name)

 

//按今天签到次数排名

select true_name,datetime,ip_address,count(*) as num  from sign_in Where DATE_FORMAT((datetime),'%Y-%m-%d') = DATE_FORMAT(NOW(),'%Y-%m-%d') group by true_name order by num desc

 

//今天讲题

select * from teach Where DATE_FORMAT((datetime),'%Y-%m-%d') = DATE_FORMAT(NOW(),'%Y-%m-%d') 

 

//今天讲题 按老师分组

select * from teach Where DATE_FORMAT((datetime),'%Y-%m-%d') = DATE_FORMAT(NOW(),'%Y-%m-%d') group by name_teacher

 

//今天讲题 按老师分组 大于等于两题

select * from teach Where DATE_FORMAT((datetime),'%Y-%m-%d') = DATE_FORMAT(NOW(),'%Y-%m-%d') group by name_teacher having count(*)>=1

 

//今天每个老师讲题次数并排序15:29 2011-06-30

select name_teacher,count(*) as num from teach Where DATE_FORMAT((datetime),'%Y-%m-%d') = DATE_FORMAT(NOW(),'%Y-%m-%d') group by name_teacher order by num desc

 

//今天每个学生讲题次数并排序

select name_student,count(*) as num from teach Where DATE_FORMAT((datetime),'%Y-%m-%d') = DATE_FORMAT(NOW(),'%Y-%m-%d') group by name_student order by num desc



   在用C或者C++处理大数时感觉非常麻烦,但是在JAVA中有两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类,
两个类的对象能表示最大范围理论上能够表示无线大的数,只要计算机内存足够大。 这两个类都在java.math.*包中,因此每次必须在开头处引用该包。


Ⅰ基本函数:

1.valueOf(parament); 将参数转换为制定的类型
比如 int a=3;
BigInteger b=BigInteger.valueOf(a);

则b=3;

String s=”12345”;
BigInteger c=BigInteger.valueOf(s);

则c=12345; 
                                                                                    

2.add(); 大整数相加
BigInteger a=new BigInteger(“23”);
BigInteger b=new BigInteger(“34”);
a.add(b);

3.subtract(); 相减

4.multiply(); 相乘

5.divide(); 相除取整

6.remainder(); 取余

7.pow(); a.pow(b)=a^b

8.gcd(); 最大公约数

9.abs(); 绝对值

10.negate(); 取反数

11.mod(); a.mod(b)=a%b=a.remainder(b);

12.max(); min();

13.public int comareTo();

14.boolean equals(); 是否相等

15.BigInteger构造函数:

一般用到以下两种:
BigInteger(String val);
将指定字符串转换为十进制表示形式;

BigInteger(String val,int radix);
将指定基数的 BigInteger 的字符串表示形式转换为 BigInteger

Ⅱ.基本常量:

A=BigInteger.ONE 1
B=BigInteger.TEN 10
C=BigInteger.ZERO 0

Ⅲ.基本操作
1. 读入:
用Scanner类定义对象进行控制台读入,Scanner类在java.util.*包中

Scanner cin=new Scanner(System.in);// 读入
while(cin.hasNext()) //等同于!=EOF
{
   int n;
   BigInteger m;
   n=cin.nextInt(); //读入一个int;
   m=cin.nextBigInteger();//读入一个BigInteger;
   System.out.print(m.toString());

}

Ⅳ.运用

四则预算:

import java.util.Scanner;import java.math.*;import java.text.*;public class Main {public static void main(String args[]){ Scanner cin = new Scanner ( System.in ); BigInteger a,b; int c; char op; String s; while(cin.hasNext() ) { a = cin.nextBigInteger(); s = cin.next(); op = s.charAt(0); if( op == '+') { b = cin.nextBigInteger(); System.out.println(a.add(b)); } else if( op == '-') { b = cin.nextBigInteger(); System.out.println(a.subtract(b)); } else if( op == '*') { b = cin.nextBigInteger(); System.out.println(a.multiply(b)); } else { BigDecimal a1,b1,eps; String s1,s2,temp; s1 = a.toString(); a1 = new BigDecimal(s1); b = cin.nextBigInteger(); s2 = b.toString(); b1 = new BigDecimal(s2); c = cin.nextInt(); eps = a1.divide(b1,c,4); System.out.print( a.divide(b) + " " + a.mod(b) + " "); if( c != 0) { temp = "0."; for(int i = 0; i < c; i ++) temp += "0"; DecimalFormat gd = new DecimalFormat(temp); System.out.println(gd.format(eps)); } else System.out.println(eps); } } }}例子:求一个n元素集合中k个元素的组合数量:C(n,k) = n!/(k! * (n-k)!)import java.math.BigInteger; import java.util.*;import java.io.*; public class FactorialBigIntegerTest { public static void main(String[] args) throws Exception { Scanner cin=new Scanner(System.in); int T = cin.nextInt(); for(int i = 0;i < T;i++){ int n=cin.nextInt(),k=cin.nextInt(); BigInteger nf= new BigInteger(""+factorial(n)); BigInteger kf= new BigInteger(""+factorial(k)); BigInteger nk = new BigInteger(""+factorial(n-k)); BigInteger n1 = new BigInteger(""+nf.divide(kf)); System.out.println(n1.divide(nk)); } } private static final BigInteger factorial(int n){ BigInteger bigInteger=new BigInteger(""+n); if(n==0) return BigInteger.ONE; else return factorial(n-1).multiply(bigInteger); } } 输入 2000 50运行结果:

19961695734279236211032903597262781251004330223561192760088208846391036329722665786642280715824928160

 

例子:

poj2305

大数的进制转换

 

String st = Integer.toString(num, base); // 把num当做10进制的数转成base进制的st(base <= 35).
int num = Integer.parseInt(st, base); // 把st当做base进制,转成10进制的int(parseInt有两个参数,第一个为要转的字符串,
                                      // 第二个为说明是什么进制).
BigInter m = new BigInteger(st, base); // st是字符串,base是st的进制.

1.如果要将一个大数以2进制形式读入 可以使用cin.nextBigInteger(2);
当然也可以使用其他进制方式读入;

2.如果要将一个大数转换成其他进制形式的字符串 使用cin.toString(2);//将它转换成2进制表示的字符串

 

关键代码:

Scanner cin=new Scanner(System.in);BigInteger p,m,ans;

p=cin.nextBigInteger(b);//从命令行以b进制读大数m=cin.nextBigInteger(b);ans=p.mod(m);//p%m