2007
年
9
月
19
日
星期三
(
3
)
1664
放苹果
简单的递归
算法如下:
1):要么每个盘子都放一个,要么只放到n-1个盘子
代码如下:
int placeapple(int m,int n)
{
if(m<0)return 0;//有些盘不放,已在placeapple(m,n-1)里面了,故返回零
if(m==0)return 1;//每个盘都放一个,这是一种情况
if(n==0)return 0;//剩余的只放到一个盘去,已在placeapple(m,n-1)里面了,故返回零
return placeapple(m-n,n)+placeapple(m,n-1);//要么每个盘都放一个,要么只放到n-1各盘
}
3077
Rounder 送分题
题意:
从最低位开始向最高位四舍五入
代码:
略
3078
Q 简单的模拟题
算法:
1):设置两个数组a[],b[],把每次操作中的a中指定的元素放到数组b指定的位置去
2):把数组a中剩余的元素依次放到数组b中的空位即可!
3):按序输出数组b的各元素
代码:
略
2007
年
9
月
20
日
星期四
(
4
)
1458
Common Subsequeuece 动态规划求最长公共子序列
算法:
典型的简单的动态规划
代码:
略
注意的地方:读入字符串时候while(scanf("%s%s",a,b)==2),这样子是AC,while(scanf("%s%s",a,b))这样子是TLE!
2007
年
9
月
21
日
星期五
(
6
)
2014
Flow Layout 简单的模拟题(送分题)
算法:
无
代码:
略
注意的地方:这类题目就是要小心!!!凡是模拟题都是!!!
2766
Laserbox 模拟题,有点烦,主要还是不够细心!
算法:
无
代码:
略
2007
年
9
月
22
日
星期六
(
8
)
1125
Stockbroker Grapevine 典型的FLOYD
算法:
floyd
代码:
略
2421
Constructing Roads 最少生成树(prim)(kruskal还没调出来)
算法:
prim
代码:
void prim(int a[][max],int n,int v)
{
int lowcost[max],vset[max],cost=0;
for(int i=1;i<=n;i++)
vset[i]=0;
for(i=1;i<=n;i++)
if(i!=v)
lowcost[i]=a[v][i];
for(i=1;i找出n-1个顶点
{
int min=INF,k=-1;
for(int j=1;j<=n;j++)
if(vset[j]==0&&lowcost[j]
{
min=lowcost[j];
k=j;
}
cost+=min;
vset[k]=1;
for(j=1;j<=n;j++)
if(vset[j]==0&&lowcost[j]>a[k][j])
lowcost[j]=a[k][j];
}
cout<
}
备注:
其实prim算法的代码跟Dijkstra算法求最短路径很相像,都用到一个标志数组和要寻找最短的边
2007
年
9
月
23
日
星期天
(
9
)
3388
Jananese Puzzle 简单的二分
算法:
二分
代码:
略
2007
年
9
月
24
日
星期一
(
13
)
3385
Genealogy 简单题
算法:
无
代码:
略
3386
Halloween Holidays 简单题
算法:
无
代码:
略
1088
滑雪
动态规划
算法:
DP的记忆化搜索
代码:
int skee(int I,int j)
{
Int max=1,tmp;
If(len[i][j]!=-1)return len[i][j];
{
Tmp=skee(i-1,j);
If(max
}
{
Tmp=skee(i+1,j);
If(max
}
{
Tmp=skee(i,j-1);
If(max
}
{
Tmp=skee(i,j+1);
If(max
}
Len[i][j]=max;return max; }
1159
Palindrome 给出一个句子,问插入几个字符可使之成为回文
算法:
典型的DP
代码:
if(s[i]==s[j])min[i][j]=min[i+1][j-1];
else min[i][j]=minimum(min[i+1][j],min[i][j-1])+1
其中,i从n开始到1,j从i到n,最后min[1][n]就是所求!
2007
年
9
月
25
日
星期二
(
14
)
1978
Hanafuda Shuffle 简单题
算法:
无
代码:
略
2007
年
9
月
26
日
星期三
(16)
1080
Huma Gene Functions 变种最长公共子序列(DP)
算法:
DP(LCS)
代码: 动归方程
func[i][j]=max(func[i-1][j]+w[a[i]][0],func[i][j-1]+w[0][b[j]],func[i-1][j-1]+w[a[i]][b[j]])
2196
Specialized Four-Digit Number 简单题
算法:
用de记录num用十进制表示时的各位数之和,du记录用12进制表示时的各位数之和,he则记录十六进制时的各位之和,若de==du==he,则输出num
代码:
略
2007
年
9
月
27
日
星期四
(20)
2039
To And Fro 简单题
算法:
按序保存在一个二维矩阵,再以列优先输出即可
代码:
略
2013
Symmetric Order 简单题
算法:
i从1开始每隔2就输出该字符串(i0)
代码:
略
2606
Rabbit Hunt 简单的几何题
算法:
算出每个顶点与其他顶点的斜率并记录其斜率相等的个数的最大值,输出即可
代码:
略
3390
Print Words in Lines 线性DP
算法:
用d[i]表示打印前i个字符的最优解,则其动归方程为:
d[i]=min{d[j]+cost(i,j)},cost(i,j)表示从j到i打印在一行的代价
代码: #include
#include
· using namespace std;
· const INF=100 000 000;
· int len[10 001],min[10 001];
·
· int main()
· {
· int c,m,n;
· scanf("%d",&c);
· while(c--)
· {
· scanf("%d%d",&m,&n);
· for(int i=0;i
· scanf("%d",&len[i]);
· min[0]=pow((m-len[0])*1.0,2);
· for(i=1;i
· {
· int tmp=len[0];
· for(int j=1;j<=i;j++)
· tmp+=len[j]+1;
· if(tmp>m)
· min[i]=INF;
· else
· min[i]=pow((m-tmp)*1.0,2);
· tmp=0;
·
· for(j=1;j<=i;j++)
· {
· if(tmp!=0)tmp++;
· tmp+=len[i-j+1];
· if(tmp>m)break;
· if(min[i]>min[i-j]+pow((m-tmp)*1.0,2))
· min[i]=min[i-j]+pow((m-tmp)*1.0,2);
· }
· }
· printf("%d/n",min[n-1]);
· }
return 0;
}
2007
年
9
月
30
日
星期日
(22)
3399
Product 简单题,但自己却WA了n次
题意:
给出n个数,要求从中取k个数使得它们的乘积最大
算法:
1:当全为负数时候,若k为奇数,则取最大的k个;否则,取最少的k个;2:有正有负或全为正的时候,若k为奇数,先取最大的正数,然后从两头开始每两个的取,并选之中乘积较大的两个
代码:
略
1862
Stripies 简单的数学题
题意:
给出一列数,每次去两个最大的数(均值不等式)按公式2*sqrt(m1*m2)合并为一个数,到最后只剩下一个数并输出即可!
算法:
无,只是要特别考虑只有一个数的时候
代码:
略
NUAA1111
典型的DP—01背包问题
题意:
实质就是01背包问题
算法:
动归方程:dp[i]=max{dp[i-weight]+value}
代码:
如下:
#include
using namespace std;
struct node
{
int weight;
int value;
}a[101];
int n,m,s[101],dp[2001];
int main()
{
int i,j,k,sum;
while(scanf("%d",&n)==1)
{
for(i=0;i
scanf("%d",&s[i]);//记录各容器空间
scanf("%d",&m);
for(i=0;i
scanf("%d%d",&a[i].weight,&a[i].value);
memset(dp,0,sizeof(dp));
for(i=0;i<2001;i++)
for(j=0;j
{
k=a[j].weight;
if(i>=k&&dp[i]
dp[i]=dp[i-k]+a[j].value;
}
sum=0;
for(i=0;i
sum+=dp[s[i]];
printf("%d/n",sum);
}
return 0;
}
2007
年
10
月
1
日
星期一
(24)
2389
Bull Math 简单的大数相加
题意:
给出两个数,要求它们的和
算法:
大数相加
代码:
for
(i
=
0
;i
<lena
;i
++)
· for(j=0;j
· {
· c[i+j]+=a[i]*b[j];
· c[i+j+1]+=c[i+j]/10;
· c[i+j]%=10;
· }
· if(c[i+j-1]!=0)lenc=lena+lenb;
else lenc=lena+lenb-1;
2371 Questions And Answers
题意: 给出一个数组,要求排序后按给定的下标输出
算法: 无
代码: 略
2007年10月2日星期二 (25)
1731 Orders 用STL解决的简单题
题意: 给定一个字符串(最长为200个字符串),输出其全排列
算法: 用next_permutation()和prev_permutation()求组合数,但注意要先排序,包含在algorithm里面,其中还有sort(),好用!
代码:cin>>s;
· int len=strlen(s);
· sort(s,s+len);
· cout<
· while(next_permutation(s,s+len))
cout<
2007年10月3日星期三 (29)
1256 Anagram 跟组合有关的题目
题意: 给出一个字符串,要求输出所有排列组合数,但顺序是A
算法: nest_permutation()的另一种用法
代码:
#include
#include
#include
using namespace std;
class order
{
public:
bool operator() (char x, char y)
{
if (x == y)
return x < y;
if (x == y + 32 || y == x + 32)
return x < y;
if (x >= 'A' && x <= 'Z')
x += 32;
if (y >= 'A' && y <= 'Z')
y += 32;
if (x != y)
return x < y;
}
};
int main()
{
int m;
cin >> m;
string x;
string y;
for (int i = 0; i < m; ++i)
{
cin >> x;
sort(x.begin(), x.end(), order());
cout << x << endl;
y = x;
while(next_permutation(x.begin(), x.end(), order()))
{
if (y != x)
cout << x << endl;
y = x;
}
}
return 0;
}
1833 排列 有一个关于组合的问题
题意: 给出一组数,输出从该组合开始的第k组合数
算法: next_permutation()
代码: 略
1146 ID Codes 组合
题意: 一个字符串,存在下一个排列的,输出,否则,输出“NO..”
算法: next_permutation()
代码: 略
2245 Lotto 组合问题
题意: 给出一组数(6到13个),把其中由6个数组成的序列按从小到大顺序输出
算法: 超暴力,六个for循环
代码: 略
2007年10月4日星期四 (30)
1141 Brackets Sequence动态规划之记忆化搜索
题意: 给出以列括号’(‘,’)’,’[‘,’]’,其中’()’,’[]’是规则序列,若A和B是规则序列,则’(A)’,’[A]’,AB也是规则序列,现在问对于所给出的括号序列,问最少添加几个括号,使之成为规则序列
算法: 记忆化搜索(DP)
代码: D:/program/1141/1141.cpp
2007年10月5日星期五 (31)
2136 Vertical Histogram简单题
题意: 给出一个大写的字符串序列,计算各个字符出现的次数,并打表输出,注意不能输出多余的空格(WA了n次)
算法: 就是要注意不能输出多余的空格即可
代码: 略
2007年10月8日星期一 (32)
2405 Beavegnaw 简单的数学题
题意: 已知圆台的底直径D和体积V,求上直径d,台高为D-d
算法: 就一个圆台体积公式
代码: 略
2007年10月9日星期二 (34)
2737 Swamp Things
题意: 给出n(n<1000)个点,算出最多的共线的点(不少于4,如果少于4,输出0)
算法: for i:0 to n-max 确定一个顶点,并算出与其余各点的斜率(如此即可保证只要斜率相等就一定共线),记下过这点的直线族中顶点最多的数目max
代码: D:/program/2737/2737.cpp
2738 Two Ends
题意: 两个人(假设是player1和player2)玩游戏,给出一列数,要求必须从数组的两头开始取,player1先取,接着player2采用贪心法,即取数组两头中较大的那个数,如此取法直至把所有的数取完,要求使得player1-player2的值最大
算法 记忆化搜索(DP)
Player1=max{
a[low]+
max{solve(low+2,high),solve(low+1,high-1)},
a[high]+
max{solve(low,high-2),solve(low+1,high-1)}
}
代码: D:/program/2738/2738.cpp
2007年10月10日星期三 (36)
2033 Alphacode 动态规划之记忆化搜索
题意: A,B,C…..X,Y,Z分别对应1,2,3…..24,25,26,现在给出一个数字串,问有几种翻译的方法
算法: 记忆化搜索
代码:
int solve(int i)
· {
· int tmp=0;
· if(i>=len)return 1;
· if(dp[i]!=0)return dp[i];
· if(s[i]>'2'||(s[i]=='2'&&s[i+1]>'6'))
· tmp=solve(i+1);
· else if((s[i]=='2'||s[i]=='1')&&s[i+1]=='0')
· tmp=solve(i+2);
· else if(s[i]=='1'||(s[i]=='2'&&s[i+1]<='6'))
· {
· if(i+2<=len)
· tmp=solve(i+1)+solve(i+2);
· else if(i+1<=len)
· tmp=solve(i+1);
· }
· dp[i]=tmp;
return tmp;
}
1118 Lining Up 简单的几何题
题意: 给出一列点,问共线的最多点数(与2606一样)
算法: 算出斜率,排序,搜一遍即可
代码: 略
2007年10月11日星期四 (37)
2036 I Conduit 几何题,有点麻烦
题意: 可以抽象为:给出n条线段(n<=10000),若任意两条线段平行且有交点,则可以把两条线段合并为一条,问最后剩下有几条?
算法: 按线段的斜率、与y轴的截距、最小的x轴坐标、最小的y轴坐标从小到大排序,再搜一遍即可
代码: 略
2007年10月14日星期日 (38)
1045 Bode Plot 简单的物理题(如果知道公式的话)
题意: 给出几个已知量和两个要用到的公式要求推算出另一变量的值
算法: 无
代码: 略
2007年10月15日星期一 (41)
2092 Grandpa is Famous简单题
题意: 给出一串数字,要求输出出现次数第二多的数,如果超过一个,就从小到大输出
算法: 快排
代码: 略
2260 Error Correction 简单题
题意: 给出一个布尔(0 1)数组,若每行每列的和都是2的倍数,则输出OK;否则,若只是通过改变数组中的一位就使得数组满足上述条件,输出相应的操作;否则,输出Corrupt
算法: 在判断只改变一位就满足条件的时候,只要找出不满足条件的第一行i,然后在该行中的各列寻找不满足条件的列j,修改该位后再判断是否满足即可
代码: 略
3359 Wordfish 简单的排列组合题
题意: 给出一个大写的不超过21个字符的字符串,往前和往后各生成10个字符串,然后在这21个字符串当中的找出一个最大的相邻字符的绝对值只差最少的字符串,然后输出该串和该数字即可
算法: next_permutation()和prev_permutation()
代码: 略
2007年10月16日星期二 (42)
3421 X-factor Chains 数学题
题意: 给定一个数m,要求最长序列1、x1、x2….m,其中x2可以被x1整除,问这样的最长序列有几个?
算法: 算出m可被哪些素数整除和各个素数在这里出现的次数,假设m可被整除n次,而每个素数出现的次数为c1、c2...那么,这样的序列的个数num=n!/c1!*c2!*..
代码: 略
2007年10月17日星期三 (44)
3278 Catch That Cow 简单的搜索题
题意: 在x轴的正半轴上,给定人和奶牛的坐标n和k,而人有三种走法:1):往前走一步,2):往后走一步,3):从n跳到2*n,但若人在奶牛的右边,那么人只能一步一步的往回走,现在问人要抓到奶牛最少要走的步数!
算法: 广搜,范围不大,才100,000,设个标志数组即可
代码: 略
1113 Wall 典型的凸包(第一个凸包)
题意: 有一个宫廷,要求用最短的墙围起来,但墙离宫廷的距离不能少于一个给定的值
算法: 凸包,
代码: 略
2007年10月18日星期四 (45)
2187 Beauty Contest 典型的凸包(第二个凸包,我要找第三个!!!)
题意: 给定一堆点,要求出任意两点之间的最大距离(严格的说是距离的平方)
算法: 凸包Graham-Scan,算出外围的点之后,求任意两点的距离,取最大的即可(据说还有优化的方法!我这是最笨的^_^)
代码: 略
2007年10月19日星期五 (50)
2941 Homogeneous Squares 数学题
题意: 一个行列数为n的二维数组,如果每n个不同行不同列的数的和都相等,则输出YES,否则…..
算法: 如果跟对角线平行的每行数的和都相等,则可认为是相等的,这样做就AC了,但不能证明其正确性
代码: 略
2940 Wine Trading in Gergovia贪心题
题意: 一个城镇里每户人家(房子都在一条直线上)都提供酒或需要酒,并且供需平衡,已知相邻两户人家每搬运一个单元的酒就需要k个单元的劳动力,现在问该如何搬运使得所需的劳动力最少
算法: 非常典型的贪心:从第一户人家开始,不管其是供还是需x,都必须在第一户和第二户之间搬运x单元的酒,此时合并这两户人家,假设其需或供y单元的酒,则再与第三户人家比较时候,要搬运y单元的酒,如此下去,直至第n户人家】
代码:while(n--)
· {
· int x;
· scanf("%d",&x);
· x+=rest;
· total+=abs(x);
· rest=x;
}
2864 Pascal Library 菜题
题意 : 有n个人,举行过d次活动(筹款晚宴),用一个d行n列的二维数组表示其出席情况,出席了为1,否则,为0,现在问有没有至少一个人出席了全部的活动
算法: 略
代码: 略
2159 Ancient Cipher 看起来蛮吓人的,其实是菜题,理解题意万岁!
题意: 有两种加密的方法:1):替换,即用另一个字符替代这个字符,2):排列组合,即把该字符串的顺序搞乱。现在给出一个密码和一个猜测的答案,问可否由密码按照某种方法得到那个猜测的答案
算法: 看两个字符串中相同字符出现的次数是否相等即可
代码: 略
1565 Skew Binary数学菜题
题意: 有一种二进制表示方法:即从最后一位开始往前的第一个非零数字可以为2,现在给出这样的一个二进制数,要求输出其十进制形式
算法: 略
代码: 略
2007年10月20日星期六 (52)
1228 Grandpa’ Estate 凸包
题意: 爷爷的庄园是用一些插在地上的一些圆柱围起来使得能够和别人的庄园区分开来,但因年久失修,有些圆柱已经不见了,现在问能不能够从剩下的这些圆柱中唯一的确定庄园?
算法: 典型的凸包,由题意可知这些圆柱都是凸包上的点,而从这些点来唯一的确定庄园,必须是凸包边上都必须由三个或以上的点,因为如果只有两个点,那么我们一点可以再添一个点,使得这个点和原来的这些点组成一个更大的凸包,也就是说凸包不唯一!
代码: 略
2301 Beat the Spead 绝对的菜题!
题意: 给定两个数,如果第一个数大于第二个数,则一次输出两数的差的二分之一和两数和的二分之一,否则,输出impossible
算法: 无
代码: 略
2007年10月21日星期日 (54)
3425 Customer support 简单的数学题
题意: 客户每问一个问题:如果得到一个错误的回答,收费10¥;如果只是得到一个正确的答案,收费20¥;如果得到一个正确的答案并且有解释,收费40¥;如果问的问题已被正确回答过n次,则营收费40+n*10¥,现在要求输出一个月的收入
算法: 无
代码: 略
3427 Ecology tax理解好题意,其实也是菜题
题意: 一个森林有n棵高度已知的树,树每年长高一米,有一个采伐公司到这个森林里伐木,这个公司的汽车每次可以运走长度为l的圆柱,所以必须把每棵树都截成长度为l的圆柱,而剩下的就是浪费掉的,而该国家有规定,浪费木材是要受罚的,而且受罚的程度和浪费的程度成正比,现在要问公司应该在那一年采伐可使受罚的最低?
算法: 只要看哪一年的树的高度是l的倍数的数目最大即可(只要在0-l之间寻找即可)
代码: 略
2007年10月22日星期一 (56)
2051 Argus 数学题,看起来规模蛮吓人,强暴力过的
题意: 有点难懂,呵呵,就是把一个数轴上的一些点初始化为一个值,而这些被初始化的点的倍数也是这个值,现在要求出最早出现的n个值,如果在一个点上有超过一个的值,按值从少到大输出
算法: 暴力
代码: 略
2546 Circular Area 数学题
题意: 求两个圆的重叠部分的面积
算法: 无,就是要非常的小心!
代码: 略
2007年10月23日星期二 (58)
1654 Area 几何题
题意: 求多边形的面积
算法: 叉积求面积
代码: 略
1183 反正切函数的应用 数学题
题意: 中文题,意思很好懂!
算法: 1/a = (1/b+1/c) / (1 - (1/b) * (1/c))
1/a = (b+c)/bc / (1-1/bc)
a = (bc-1) / (b+c)
令 m = b+c
则 c = m - b;
m = (b^2+1)/(b-a)
令 i = b-a
则 m = i + 2a + (a^2+1)/i //最后表达式
i+ (a^2+1)/i >= 2*sqrt(a^2+1)
所以: i >= sqrt(a^2+1) 或 i<= sqrt(a^2+1)
则 m >= 2*sqrt(a^2+1) + 2a
所以可以令 i 从 a 开始循环 i--;
直到 (a^2+1)%i == 0 再求出m即可
代码: 略
2007年10月25日星期四 (59)
3435 Sudoku Checker 菜题一个
题意: 就是看看一个矩阵里面的每个小矩阵里面的数字有没有重复
算法: 暴搜
代码: 略
教训: 这题WA了n次,原因在于自己偷懒不看题目!
2007年10月26日星期五 (60)
1019 Number Sequence 数学题
题意: 一个数字排列,即1,12,123,1234…..,给定一个数n(n刚好在一个整数范围里),要求输出第n位数字
算法: 利用函数ltoa(num,str,radix)把相应的数字转化为字符串,然后再逐个数即可
代码: 略
辅助: 这两天堕落了,一直没做题,敲响警钟!!!
2007年10月29日星期一 (63)
3096 Surprising Strings字符串问题
题意: 给定一个字符串(长度不超过80),以两个字符下标的差值(1,2,3..)分组,并以这些长度为2的字符串为组的元素,如果在任意一组里面有相同的字符串,则为surprising,否则是 not surprising
算法: 暴力,规模不大,好像还是0ns
代码: 略
3100 Root of the Problem 数学题
题意: 给定两个数b(b<1000000)和n(1<=n<=9),现在要算出a的n次幂与b最接近的a
算法: 暴力,规模虽然有点大,稍微剪一下枝就过了
代码: 略
3095 Linear Pachinko 模拟题
题意: 就一个模拟
算法: 模拟
代码: 略
2007年10月30日星期二 (66)
3348 Cows 凸包
题意: 一个农场里有很多的树,现在要以这些树作为支点来围一个面积最大的牧场,已知一只羊至少需要50平方米的草场,问最多可以养几只羊??
算法: 凸包
代码: 略
1274 The Perfect Stall
题意: 一个牧场里面有n只奶牛和m个挤奶场,其中一头奶牛可能到一个或几个挤奶场,现在问一次最多能有几个挤奶场同时在使用当中
算法: 最大匹配
代码: 略
1455 Crazy tea Party
题意: 有n个人出席并围成一圈的茶会,相邻两个人可以互换位置,现在问最少经过几次交换以后可以使得原来在左边的人跑到右边去
算法:求逆序数:若是线形无环,将1-n变为n-1,求逆序数n*(n-1)/2即可(线性代数)但本题由于是环,则在1-n中取一k,将1-n变为形如k-1,n-(k+1)也可满足条件,比如1,2,3,4,5变为3,2,1,5,4也可满足条件。问题转换为只需确定一k,使逆序数最小。设一k,对于k-1和n-(k-1)分别求逆序数:k-1:k*(k-1)/2n-(k+1):(n-k)*(n-k-1)/2则总共的逆序数为k*(k-1)/2+(n-k)*(n-k-1)/2,根据一元二次方程最低点(-b/2a)求得当k=n/2时该式最小
代码:略
2007年10月31日星期三 (68)
3438 Look and Say
题意: 把看到的一个数字串用说的方式表达出来,如:123就是说 有一个一,一个二,一个三,所以结果是111213
算法: 模拟题吧
代码: 略
3445 Elementary Additions
题意: 数字的用大括号来表示(详见题目),要求输出两个数的和
算法: 打表
代码: 略
2007年11月1日星期四 (71)
1939 Diplomatic License数学题
题意: 很多的国家之间需要互相的通信,而这些国家所在的位置围成一个圆圈,假设每两个相邻的国家需要在一个地方开会,已知每个国家去开会的人每走相同的距离的价钱是一样的,现在要求找出最合适的开会的地方?
算法: 其实就是算每两个相邻国家(注意:第一个国家和最后一个国家是相邻的)之间的中点
代码: 略
1936 All In All
题意: 给出两个字符串s和t,问s是否可以从t中通过去掉一些字符来得到
算法: 暴搜
代码: 略
1942 Paths on Grid
题意: 给出一个n*m的矩阵,有两种走法:一是往右走,二是往上走,现在问从左下角到右上角有几种走法
算法: T路的计数,即(n+m)!/n!*m!
代码: 略
附注: T路的计数还没找到相关的资料
2007年11月4日星期日 (73)
2140 Herd Sums 数学题
题意: 给一个整数n,问有几种方法可使几个连续的数的和等于n
算法: k=(sqrt(1+8*n)-1)/2,即子序列的长度不会超过k. 接着从1到k一个一个判断 a=(2*n-k*k+k)%(2*k)是否为0,如果是则总数加1,否则继续循环.
代码: 略
附注: 数学功底太差了,搞本组合数学研究研究!
1922 Ride to School 数学题
题意: Charlie骑车从公寓到教室,首先在公寓门口等同学,当有同学来就跟着他走,如果在路上有比原来这个同学更快,就又跟着他走,问Charlie什么时候到教室
算法: 简单的数学题
代码: 略
2007年11月5日星期一 (76)
1466 Girls and Boys 匹配
题意: n个学生里面(没有说明那个是男那个是女),给出每个学生可能的发展对象,问不可能成为情侣的学生的个数?
算法: 算出最大匹配数m,答案是n-m/2;
代码:
bool can(int t)
· {
· for(int i=0;i
· if(used[i]==0&&mat[t][i])
· {
· used[i]=1;
· if(link[i]==0||can(link[i]))
· {
· link[i]=t;
· return true;
· }
· }
· return false;
· }
·
· int MaxMatch()
· {
· int count=0;
· memset(link,0,sizeof(link));
· for(int i=0;i
· {
· memset(used,0,sizeof(used));
· if(can(i))count++;
· }
return count;
}
1469 COURSES 匹配
题意: n个学生,p门课程,给出每个学生可以上的课,问是否存在同时有p个学生在分别上这p门课程
算法:就一个匹配
代码:见上
2239 Selecting Courses匹配
题意:李明在开学时候选课,已知有n门课程,其中这n门课可能不止讲一次,但就是时间不同。李明很爱学习,请你帮他安排时间选尽可能多的课
算法:还是一个匹配
代码:略
2007年11月10日星期六 (77)
1422 Air Raid 匹配
题意: 一个城市的街道全是单向的,其中每两个十字路口都有一条通路连接,现在给出这些十字路口的通路情况,问最少只要几个人即可把所有的十字路口都走遍
算法: 匹配算法
代码: 略
2007年11月12日星期一 (81)
2403 Hay Points 简单题
题意: 已知具备某些才能的一个工人需要工钱若干,现在一个公司要招聘一个工人,其中列出这个工人所必须的才能,问要付给这个工人多少工钱
算法: 无
代码: 略
1330 Nearest Commen Ancestors简单题
题意: 给出一棵树各顶点的连接情况,每个顶点有相应的一个序号,从树根到给出的两个顶点的通路的各顶点中,求离这两个顶点最近的一个顶点
算法: 用一个一维数组(滚动数组)记录相应顶点的父节点,求出两个顶点的通路后直接找出最近的那个即可
代码: 略
2533 Longest Ordered Subsequence DP
题意: 求一个序列的最长递增子序列
算法: 简单的DP
代码: 略
1887 Testing the CATCHER
题意: 求一个序列的最长递减子序列
算法: 简单的DP
代码: 略