简单记录本学期学习的计算几何知识,归类如下:

  • 点,线段
  • 点与直线,线段,矩形,多边形的位置关系
  • 线段/直线相交
  • 向量,向量叉积
  • 凸包
阅读全文 »

定义

设给定边容量为CV,W的有向图G=(V,E)。这些容量可以代表一个管道的水的流量或者两个交叉路口之间马路上的交通流量。
有两个定点,一个是s,成为源点,一个是t,成为汇点。对于任意条边(v,w),最多有CV,W个单位的“流”可以通过。
最大流问题就是确定从s到t可以通过的最大流量。

阅读全文 »

介绍

overthewire 是一个 wargame 网站。
其中 Bandit 是最简单的系列,主要是考察一些基本的 Linux 命令行操作。
目前共26关,月初的时候做了一周,还有最后两关没做出来。
不久前看到 Nikkko 在 wooyun 上发了攻略,现在把最后几个搞定,把思路和知识点记录一下,以供参考。

详解

游戏规则:每一关都有一个 login name, IP address(domin), password
前两个已知,通过 ssh 登录到某一关卡,根据信息找到下一关的 password 即可。

每一关的详解记录,参见 Github 笔记

下面给出各关卡的知识点

阅读全文 »

东南大学的学生办了一场线上CTF,时间为2015年5月17日(周日)10:00至2015年5月24日(周日)10:00
然后呢,当时花了两天答了一些题,趁者官方还没发出完整writeup, 总结下我 PASS 的题目。
题型有五大类,如下:

  • Misc
    • 签到题(PASS)
    • 大海捞针(PASS)
    • 娱乐~娱乐~(PASS)
  • Crypto
    • 困在栅栏中的凯撒(PASS)
    • 神奇的数字13(PASS)
    • 盲人摸象(PASS)
    • bright?
    • 加密系统
  • Forensics
    • 纯色(PASS)
    • Fate!!!(PASS)
    • 脑洞
  • Reverse
    • Hello World
    • 论数学的重要性
    • Ingres
    • 十万火急(PASS)
  • Web
    • 城市查询系统
    • 又一个任务
    • 小黑的烦恼
    • Discuz?
    • Flag你在哪里?(PASS)
    • 源码中的乾坤(PASS)
阅读全文 »

##引入

晚上在宿舍想看看论文,于是登录图书馆主页,转到知网,结果被告知ip未授权,看来只有内网可以访问那个帐号。
尝试用x-forwarded-for构造ip,失败。
正好发现图书馆登录时的验证码很有趣,找到源码分析一下。

阅读全文 »

##问题描述

子集和问题(subset sum)描述:
给出一个整数集合 S 和一个整数 N,问 S 中是否存在一个子集合,这个集合里的元素和等于 N

属于01背包问题,下面列举常用的解决方法:

阅读全文 »

##练习

练习1:UVA 674
有1,5,10,25,50这五种硬币。给一个价值target,求有多少种组合可以得到该价值。
完全背包问题,硬币类型给定,数量不限。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int Count(int n, int m) { 
// n:the total sum of money, m:the kinds of conis
// use first m kinds coins to exchange n yuan
// num[i] will be storing the number of solutions for value i.
// We need n+1 rows as the table is consturcted in bottom up manner using the base case (n = 0)
// Base case (If given value is 0)
num[0] = 1;

// Pick all coins one by one and update the num[] values
// after the index greater than or equal to the value of the
// picked coin
for(int i=0; i<m; i++)
for(int j=kind[i]; j<=n; j++)
num[j] += num[j- kind[i]];

return num[target]; // target is the aimed money to exchange
}

练习2:UVA 147
和练习1基本一样求方案数,完全背包问题,此题注意浮点数精度问题(加上个0.5)。

1
2
3
4
num[0] = 1;
for (int i=0; i<m; i++)
for (int j=kind[i]; j<n; j++)
num[j] += num[j - kind[i]];

练习3:UVA 166
硬币类型已知,我要去商店买东西。商店硬币数量无限,我携带硬币数量有限,并给出每类硬币具体数量。
给定要付的金额,问付钱找钱过程中最少使用几枚硬币?

商店硬币无限,计算凑i元前最少使用硬币数,即shopmin[i],完全背包问题
我的硬币有限,计算凑i元前最少使用硬币数,即mymin[i],多重背包问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
void countShop(){
shopmin[0] = 0;
for (int i=1; i<MAXMONEY; i++)
shopmin[i] = 9999; //just a large nuber
for (int i=0; i<MAXCOIN; i++) {
for (int j=kind[i]; j<MAXMONEY; j++) {
shopmin[j] = Math.min(shopmin[j-kind[i]]+1, shopmin[j]);
}
}
}

void countMy(){ // eachcoin[]: numbers of each coin
mymin[0] = 0;
for (int i=1; i<MAXMONEY; i++)
mymin[i] = 9999;
for (int c=0; c<MAXCOIN; c++) {
while (eachcoin[c] > 0) {
for (int i=MAXMONEY-kind[c]-1; i>=0; i--) {
if (mymin[i] < 9999)
mymin[i+kind[c]] = Math.min(mymin[i]+1, mymin[i+kind[c]]);
}
eachcoin[c]--;
}
}
}

int findAns(){
int ans = 9999;
for (int i=charge; i<MAXMONEY; i++){
if (9999 != mymin[i]){
ans = Math.min(ans, mymin[i]+shopmin[i-charge]);
}
}
return ans;
}

练习4:UVA 10306

define dp[i][j]: the least coins to make i yuan and j yuan
if i^2+j^2=target^2 then dp[i][j] is a answer

练习5:UVA 10313

define dp[i][j]: the count to use no more than j money coin making up to i yuan
dp[i][j] = dp[i-j][j] + dp[i][j-1]

Loading…

##Reference
背包问题的变化——求方案数
背包九讲

定义

什么是最长单增子序列(Longest Increasing Subsequence,LIS)?
一个序列S任意删除若干字符得到新序列T,则T叫做S的子序列。
一个序列S的所有子序列中,保持单调递增且长度最长的序列T,即是LIS
如序列的{-7,10,9,2,3,8,8,1}的LIS是{-7,2,3,8}

LIS的变形有以下几种:

  • 非严格定义的单调递增(最长不下降),即序列中元素可相等
  • 严格的单调递减
  • 非严格定义的单调递减(最长不上升)

以下仅以严格意义的LIS为例

阅读全文 »