这两天做了一些简单背包问题,竟然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


登录后1440秒未活动后总是自动退出,好烦呀,一天还要登录多次,感觉是session超时,结果在网上search了下,找到解决办法啦,哈哈哈,在此做个笔记:

phpmyadmin在使用过程中经常出现“登陆超时(1440秒未活动),请重新登录”,很烦

解决方法如下:

修改php.ini,找到

session.gc_maxlifetime = 1440

将数值改大就行了,然后使之生效

试验了一下,结果不好使。

 

 

最终解决方案:

找到 phpMyAdmin / libraries / config.default.php 文件,打开,修改

$cfg['LoginCookieValidity'] = 1440;

将1440修改成更大的值即可。


注意:$cfg['LoginCookieValidity']的值不能大于php.ini里的session.gc_maxlifetime的值,否则phpmyadmin 里会出现“您的 PHP 配置参数 session.gc_maxlifetime (外链,英文) 短于您在 phpMyAdmin 中设置的 Cookies 有效期,因此您的登录会话有效期将会比您在 phpMyAdmin 中设置的时间要更短。”错误。


ps:我在3.4.2和3.3.3下都修改成功,3.4.2的设置,功能里面能可以直接设置,但是我的php.ini里面最大设了1440,所以设得再大也只能本次会话有效


放暑假就是我进入ACM队一周年的纪念日吧。

不知道今年能不能继续参加暑期集训,长期打酱油,怕被教练开掉啊。

不论如何,我不会放弃的。

 

最近快期末了,想多花点时间在学习上。

本以为这个赛季的现场赛都结束了,昨天接到njupt校赛邀请,我们学校去十几个人,我也报名了。

多参加现场赛,锻炼肯定比在宿舍里大得多。

平时得我太浮躁,很难静下心来思考困难的问题。

现场比赛倒是能够给我设定这样一个环境的,没有手机、因特网的干扰,我发现自己还是能安静想问题的。

只是,我太弱了,什么算法都不会,写模拟题的能力也不行,哎。。。

 

下午南邮网络赛,完全被虐啦。

一开始还不错,不到一个小时就实现了2题,rank里面还算靠前。

然后,突然就卡住了,好几道题都卡到爆,555。

直到最后一个小时才连出两题,最终以4题饮恨。

 

其实,这个比赛难度不大,山鬼、宇娘经5个小时的鏖战,都出了8题,偶尔卡一下,时间也不长,很均匀地就逐渐跑到rank的前两位。后面的wavwind,zlly,bearjie,都是6、7题,时间足的话也能再出题,可是4题的我和他们的差距太大了。。。不是很容易就能赶上的。

 

最后时刻,我围观宇娘,拍代码的速度,正确率,甚至贴测试数据的动作都比我快了许多。

差距是全方位的,我要虚心,利用暑假,好好学习。

不要再那么得浮躁了!!!