??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
1Q江市电话L?位数Q每一位上的数码可以是0Q?Q?···8Q?中Q意一个(数字可以重复出现Q如00000也算一个电话号码)Q那么这个城市最多有多少个电话号码?
Q?Q用0Q?Q?Q?q?个数字,可以l成多少个没有重复的4位数Q?
Q?Q?#8220;IMO”是国际奥林匹克的~写Q把3个字母写?U不同的颜色Q现在有5U不同的颜色W,按上q要求能写出多少U不同颜色搭配的“IMO”.
{案?span style="COLOR: #ffffff">Q?1) 100000U?nbsp;
Q?Q?8U?nbsp;
Q?Q?0U?br>
不过好像要比爆搞更快?#8230;…ft
]]>
Time Limit: 1000MS |
|
Memory Limit: 30000K |
Total Submissions: 1342 |
|
Accepted: 587 |
Description
Running a taxi station is not all that simple. Apart from the obvious demand for a centralised coordination of the cabs in order to pick up the customers calling to get a cab as soon as possible,there is also a need to schedule all the taxi rides which have been booked in advance.Given a list of all booked taxi rides for the next day, you want to minimise the number of cabs needed to carry out all of the rides.
For the sake of simplicity, we model a city as a rectangular grid. An address in the city is denoted by two integers: the street and avenue number. The time needed to get from the address a, b to c, d by taxi is |a - c| + |b - d| minutes. A cab may carry out a booked ride if it is its first ride of the day, or if it can get to the source address of the new ride from its latest,at least one minute before the new ride's scheduled departure. Note that some rides may end after midnight.
Input
On the first line of the input is a single positive integer N, telling the number of test scenarios to follow. Each scenario begins with a line containing an integer M, 0 < M < 500, being the number of booked taxi rides. The following M lines contain the rides. Each ride is described by a departure time on the format hh:mm (ranging from 00:00 to 23:59), two integers a b that are the coordinates of the source address and two integers c d that are the coordinates of the destination address. All coordinates are at least 0 and strictly smaller than 200. The booked rides in each scenario are sorted in order of increasing departure time.
Output
For each scenario, output one line containing the minimum number of cabs required to carry out all the booked taxi rides.
Sample Input
2
2
08:00 10 11 9 16
08:07 9 16 10 11
2
08:00 10 11 9 16
08:06 9 16 10 11
Sample Output
1
2
Source
Ҏq道题目的意思,我们可以Z张图Q对于两?/span>booked taxi rideQ?/span>ri?/span>rj如果一辆R能够先完?/span>ri的Q务再有时间赶d?/span>rj的Q务,那么徏立一?/span>ri指向rj的边?br>
按照题目的要求,要选择最的taxi来完成这些Q务。显然在上面q个例子中,需要安?/span>2?/span>taxi。结合这个图Q可以把题目的要求{化ؓ扑և最的路径条数Q得这些\径覆盖途中所有的边,例如可以选择2条\?/span>1->3->4?/span>1->2可以覆盖所有的辏V也可以选择1->3->4?/span>2Q因?/span>2作ؓ初始站,不需要由1转移q来Q。对于一条连l的路径vi1->vi2->…vik׃q条路径上的d实际上是׃?/span>taxi来完成的Q可以吧q条路径退化成两个?/span>vi1->vik。有了这两步建图的步骤以后,问题的求解就可以变ؓ扑և点集的一个最子集,使这个顶点子集覆盖所有的边(每条辚w臛_和一个顶炚w的顶点相q)。这个问题就是图的最点覆盖。再看这张图Q还有一些性质能够让我们更好地求出最点覆盖。这个图是一个有向无环图Q没有自环,可以拆点,把原先徏的图变成一张二分图?br>
可以再图中看出,上面丑և的一条\?/span>1->3->4对应了这个二分图中的路径1->
?#8220;计算机图形学”?#8220;计算机图像处?#8221;是两门很有意思的评。这学期我们的课E安排还是一贯作?/p>
——课E压~,把这两门评压成了一门课E,不仅如此q用的是内部教材(传说中的内部教材是?/p>
评内容q一步精压羃Q。即便在q种情况之下Q我q是对计机囑Ş囑փ处理充满热情Q想多学些东
西,好好地做评设计。今天下课前,老师把课E设计的题目布置下来Q真令我d失望了。布|了20+
个题目,虽说涉及一些军事,但是要求真的很水。后面给Z一pd军事电媄Q灾隄影大片,做法是
Q?br>1、看片;
2、截图与PSQ?br>3、写报告与做ppt?br> 我想了一下,q里面可能一点理论,一点编E都不会涉及刎ͼq样的课E设计,玩过电脑的h都会做,q?/p>
q嘛d“信息工程”专业?#8220;评设计”里呢Q真是可W!Q!评都羃水羃到这U程度了Q那q开什
么课呢,自欺Zh|了。稍有点本专业知识的Z不至于会认ؓ计算机图像处理就是玩PS吧。那大学里学
电子工程的毕业后都去修微波炉Q通信工程的去卖电话卡Q信息工E的去照相馆做PS好了?br>?#8230;…q几天正是新生入学,q看着一批一批的新生往我们宿舍q边赎ͼ我心里真是难q,真想跟他们说
Q?#8220;回去吧,说不定来q还能考个清华?#8221;q有那么多家长,送个孩子上大学多不容易,但也总们还不知道,他们的儿子要接受q样的教肌Ӏ想着q些事,心都在痛啊?br> ?#8230;…
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 574 | Accepted: 229 |
Description
Input
Output
Sample Input
4 1 2 10 2 3 10 3 3 10 1 3 10 6 1 20 1000 3 25 10000 5 15 5000 22 300 5500 10 295 9000 7 7 6000 8 32 251 2261 123 281 1339 211 235 5641 162 217 7273 22 139 7851 194 198 9190 119 274 878 122 173 8640 0
Sample Output
30 25500 38595
Source
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 211 | Accepted: 82 |
Description
Input
Output
Sample Input
4 10.00000 0.00000 0.00000 -10.00000 -10.00000 0.00000 22.23086 0.42320 -4.87328 11.92822 1.76914 27.57680 156.71567 -13.63236 139.03195 -22.04236 137.96925 -11.70517 129.400249 -44.695226 122.278798 -53.696996 44.828427 -83.507917
Sample Output
4 6 23 100
Source
题目大意是给Z个点?x,y)坐标Q要求输Z个边数最的正多边Ş的边敎ͼ使这三个Ҏ好在
q个正多边Ş上面。其实这个三角Ş和这个正多边形是共外接圆Q由外接圆的圆心出发Q三角Ş的三
条边可以把圆分成三䆾Q每份圆弧所对应的圆心角分别为arg[0],arg[1]和arg[2]Q正多边形把圆弧
分成相等的n份,每䆾对应的圆心角?*pi/n。其实三角Ş的三个角分别占用了若干{䆾正多边Ş
所划分的圆弧,最后也只要求arg[0],arg[1],arg[2]?*pi的最大公U数(gcd)卛_。但是这里是
个角度都是QҎQ所以还定义一个QҎ的gcdQ计QҎ的gcd可以利用math.h的函数fmod
(x,y)表示x%y。例?.5%0.3=0.2Qx%y的结果ؓ不超qy的一个QҎ。下面写了一个fmod(x,y)自己
的实现?br>double fmod(double x, double y)
{
return x-floor(x/y)*y;
}
有了fmod函数以后Q就可以用它来求gcd了!
double fgcd(double a, double b)
{
double t;
if(dblcmp(a-b) == 1) //a>b
{
t=a;
a=b;
b=t;
}
if(dblcmp(a) == 0) return b;
return fgcd(fmod(b,a),a);
}
今天L大我认ؓp避免我们l再出现q种情况Q一定要读题Q要多想题!大清早坐校R一路风光的C湖大Q长沙今天搞火炬传递预演,人很多,l果校R无视旁h地开了过去)。离比赛q有一个多时的时间。这?/span>alpc62跟我_他今天的状态不好,昨晚?/span>topcoder做到很晚才睡。于是找了个地方大睡一阵,醒来后就_饱满的说今天可以敲题了?/span>
题目印刷地很乱,分题的时候就个h撕了1/3的题目?/span>Alpc62先拿CAQ用一?/span>log函数q掉了。然后我看题Q发C个中文字W串DP题,我觉得可以做Q就?/span>62说题了?/span>62大敲一阵,我就一直在N目中?/span>trickQ因为我感觉q道题有很多没说清楚的地方,不久E序写完Q没出样例,然后我们开始检查,发现题目中有一个错误,于是pȝ上看,我的天啊Q网上的描q和我们手上拿到的题目差了这么多Q按?/span>clarification上说的一切以|页上的为准Q于是我们对着|页上的题,q了样例Q一交是WAQ提交了打印代码Q于?/span>62觉得要换题。这?/span>alpc07M一道猜数字的题Q我们判断是弱题Q简单暴搞就行?/span>Alpc07上去Ԍl果WAQ这下搞得郁闷了。不我们又换题Q我又读了全场最多hq的一道题Q我开始还在想DPQ跟alpc62说了以后Q他毫不犹U地说Q?/span>dijkstra嘛,是全q成都热w赛的原题。很快就
今天在比赛中Q我基本上没有敲题,在组里面协调分题Q注意场上的形势。就在这ơ的比赛中我觉得读题对于一个队伍来说很重要。特别是惌?/span>
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 1146 | Accepted: 390 |
Description
Input
Output
Sample Input
11 6 1 2 1 3 1 4 1 5 2 6 2 7 2 8 4 9 4 10 4 11
Sample Output
2
Hint
Source
的时候分题,我读DEFQ很快我发CE是一道水题,上手敲Q测试了几个数据之后?/p>
submit了。遗憑֕Q这是我们l这场比赛唯一的一?/Y。在中南赛前夜,我还在想有尽
量多?/YQ一上场q么快就水过了一道题Q我q以Z天的题目很简单。当时的心情那个
Ȁ动啊……q题后我又立马读D题,看v来很像一道模拟题Q我自信地认题跟E一P
马上又开始敲代码Q敲着敲着发C对了Q数据量辑ֈ?00000Q暴搞的话会时Q我
意识到这道题不光是纯_的模拟Q应该要借助于些数据l构的了。我们组放慢了脚步?/p>
alpc40和alpc43仍在读题Q接着alpc40跟我讲C题,700个点中选出三个点,使得q三个点
定的外接圆半径最大。O(n^3)的时间会时Q于是我又一ơ不加思烦地说“H包”Q兴
致勃勃地敲了个突包,l果WA。打C码,以ؓ是我的突包错了,再改Q再WA。这时已l?/p>
两个多小时过MQ我们还是一个气球。一ơ次的WA让我冷静下来惻I问题没这么简单,
后来讨论发现先求H包Q再枚D点的Ҏ是错的。做了两个多时的算法从Ҏ上是错的
Q当时我预感到比赛后的l果了。最后敲了个O(n^3)的暴搞,TLE。此时我已经攑ּ了?/p>
比赛中作Z个主力,我觉得我的表现实在是太差了,没有认真地讨论和分析敲题,?/p>
部分旉占用着键盘Q以致于alpc43整场比赛都没有碰到键盘。组队赛变成了我的个
Qƈ没有发挥三个人的合力。特别是C最?5分钟Q变成了垃圾旉Q没题可做了Q我
们开始边吃汉堡,边刷rank list……
ȝq次比赛Q首先是我,Z的经验还不。比如在q次比赛中场上出C没题?/p>
Q算法错误等致命的情冉|Q我完全׃能控制这L局面,冲动Q?gt;p->攑ּQ在l队
赛中很忌讛_现这L情Ş。比赛的时候和qx做题都不一P当时脑子很混ؕQ再?/p>
没心思想其他的题目了。另外也是自q实力原因Q对题目把握得不好。对于我们组Q我
觉得互相的交和讨论q有待改q,有时说题意,Ҏ很难领会Q比赛中的讨Z没出?/p>
有意义的亮点?br> alpcs都在好好地反思反思再反?#8230;…也许l我自己的机会ƈ不多Q认真做好每一场比
赛,每场比赛都要有收莗?/p>
q了一q的努力Q今q取得了q个Z。和我同l的q有alpc40和alpc43。我们^时还?/p>
比较了解了。alpc40和我是一个宿舍的Q^时做题的交流也比较多Q我们两写程序的风格
也差不多Q一个老师教的嘛^_^Q。我觉得alpc40在做数学题,找规律的题目时还是很快能
扑ֈҎ的,在比赛的时候,他比较喜Ƣ自己出数据Q敲完题后L不断地出数据来检?/p>
自己的程序,在校赛中qZQ虽然他交题的时间不是最早的Q因Z一直在出数据测
试自qE序Q一直测到自p为没有问题了Q才提交Q很大概率出1/Y的。所以尽交?/p>
不快Q但因错得少Q罚时少Q校赛时在同样题目数的h中还是排在了前面。我觉得q点?/p>
常好Q在明天的比赛中Q我们首先要求稳。我觉得我们的实力绝对不至于强到把所有的?/p>
目都做出来,也不见得会比别h多出题,所以在很多同样题目数的ZQ还是要拼罚时的
。这需要在比赛中做的稳Q争取尽量多?/Y。我也要克服qx比较急躁的习惯,切忌?/p>
要一出样例就交,回顾一下自qE序Q测试一下数据,查找错误。这两次比赛看了
alpc43的代码,我觉得他的代码实在是很ؕQ很多羃q,换行都用得不规范Q写E序的时
候容易造成思\不清晎ͼ在检查程序的时候也很难发现错误Q会费很多旉。我觉得?/p>
赛中Q给alpc43做些代码量不大,但是思\能够出来得比较清晰的题目。至于我Q我觉得
应该担v大量的代码Q务,在组里,我的代码速度q可以。可以写点代码量大的模拟题,
量快地ACQ好为我们组节省旉。另外,一些设计算法,数据l构的题目(|络,?/p>
分图Q高_ֺQ线D|Q计几何等Q,我也要敲Ԍ争取能冲出更多的题?br> 从今天的热n赛来看,我的状态一炚w不好。可能是q个星期Q又要做题,又要考试
Q还要组l数据库的复习,有点搞得太篏了。就写这么点了,今晚休息好点Q但愿明天能
保持最佳的状态^_^
Time Limit: 15000MS |
|
Memory Limit: 150000K |
Total Submissions: 944 |
|
Accepted: 218 |
Description
The rotation game uses a # shaped board, which can hold 24 pieces of square blocks (see Fig.1). The blocks are marked with symbols 1, 2 and 3, with exactly 8 pieces of each kind.
Initially, the blocks are placed on the board randomly. Your task is to move the blocks so that the eight blocks placed in the center square have the same symbol marked. There is only one type of valid move, which is to rotate one of the four lines, each consisting of seven blocks. That is, six blocks in the line are moved towards the head by one block and the head block is moved to the end of the line. The eight possible moves are marked with capital letters A to H. Figure 1 illustrates two consecutive moves, move A and move C from some initial configuration.
Input
The input consists of no more than 30 test cases. Each test case has only one line that contains 24 numbers, which are the symbols of the blocks in the initial configuration. The rows of blocks are listed from top to bottom. For each row the blocks are listed from left to right. The numbers are separated by spaces. For example, the first test case in the sample input corresponds to the initial configuration in Fig.1. There are no blank lines between cases. There is a line containing a single `0' after the last test case that ends the input.
Output
For each test case, you must output two lines. The first line contains all the moves needed to reach the final configuration. Each move is a letter, ranging from `A' to `H', and there should not be any spaces between the letters in the line. If no moves are needed, output `No moves needed' instead. In the second line, you must output the symbol of the blocks in the center square after these moves. If there are several possible solutions, you must output the one that uses the least number of moves. If there is still more than one possible solution, you must output the solution that is smallest in dictionary order for the letters of the moves. There is no need to output blank lines between cases.
Sample Input
1 1 1 1 3 2 3 2 3 1 3 2 2 3 1 2 2 2 3 1 2 1 3 3
1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3
0
Sample Output
AC
2
DDHH
2
Source
图中?/span>#字格?/span>4条竖U,可以?/span>8个方向倒{里面的数字方块,当中间的8个数字方块是同一个数字时Q游戏结束。这道题p求搜索一个最短\径,倒{8个方向得中?/span>8个数字相{。这道题目看h很像一道单U的BFSQ看?/span>POJ里面?/span>BFS会爆内存Q我没试Q估计写得好的也爆不了。但是估计写BFSq要涉及到状态的判重Q程序写h也不方便。我用了q代加深的搜索方法。第一ơ接触这个算法,我说一下我的理解:
原来我很不理解P代加深,搜烦的深度一层一层地加,在后面的某一深度限制下搜索,必定会搜到前面深度所能搜到的l果Q这会造成重复搜烦。基于这点,我一直都认ؓq代加深搜烦的方法很冗余Q当然也是自׃来都没有动手试过。像q道题就l我的收获不,有的时候选择一定的{略q行搜烦Q我们是很难定解所在状态空间的深度的,有时可能解的深度不大Q但整个状态空间的深度很大Q盲目的dfs搜烦在状态空间里有可能会越陯深,q迟Z了解Q同时整个状态空间的宽度也很大,?/span>BFS可能׃爆空间。P代加深搜索恰恰是取了一个折中。利用了dfs的优势,限制了搜索的深度Q避免了出现无解的境地。由于深度是逐个增加的,当搜C个解后就退出,所以避免了BFS中判重的一步操作,当然在P代深搜的q程中,q可以加入剪枝,可以优化E序。但是我的程序在POJ上还不快Q还要找扑֎因,也许q有优化。下面是一些关键代码:
Source fromQ?/span> http://acm.pku.edu.cn/JudgeOnline/problem?id=2676
Sudoku中文?#8220;数独”游戏Q游戏规则是在一?/span>9×9的方g填入1Q?/span>9q?/span>9个数字,9×9的大Ҏ又被划分成了9?/span>3×3的小ҎQ要求填入的q?/span>1Q?/span>9q?/span>9个数字中Q在每一行,每一列及每一个小Ҏ中都不能重复出现?/span>
?/span>pku上,我暴搜的ҎQ将每个I格的位|几下,然后?/span>dfs往里填敎ͼ不符合条件的回溯。方法如下:
Source
Problem: 2676 User: alpc60
Memory: 80K Time: 1171MS
Language: C++ Result: Accepted
Source
#include <stdio.h>
#include <string.h>
struct P
{
int x,y,num;
}point[100];
int map[10][10],count;
bool mr[10][10],mc[10][10],mm[10][10];
int dfs(int n);
int find(int x, int y);
int main()
{
int i,j,cases;
//freopen("2676.txt","r",stdin);
scanf("%d",&cases);
while(cases--)
{
count=0;
memset(mc,false,sizeof(mc));
memset(mr,false,sizeof(mr));
memset(mm,false,sizeof(mm));
memset(map,0,sizeof(map));
for(i=1; i<=9; i++)
for(j=1; j<=9; j++)
{
scanf("%1d",&map[i][j]);
if(map[i][j]==0)
{
point[count].x=i;
point[count].y=j;
point[count].num=0;
count++;
}
else
{
mr[i][map[i][j]]=true;
mc[j][map[i][j]]=true;
mm[find(i,j)][map[i][j]]=true;
}
}
dfs(0);
//{
for(i=0; i<count; i++)
map[point[i].x][point[i].y]=point[i].num;
for(i=1; i<=9; i++)
{
for(j=1; j<=9; j++)
{
printf("%d",map[i][j]);
}
printf("\n");
}
//}
}
return 0;
}
int dfs(int n)
{
int i,t;
if(n>=count)
return 1;
t=find(point[n].x,point[n].y);
for(i=1; i<=9; i++)
{
if(!mr[point[n].x][i] && !mc[point[n].y][i] && !mm[t][i])
{
mr[point[n].x][i]=true;
mc[point[n].y][i]=true;
mm[t][i]=true;
point[n].num=i;
if(dfs(n+1))
return 1;
mr[point[n].x][i]=false;
mc[point[n].y][i]=false;
mm[t][i]=false;
point[n].num=0;
}
}
return 0;
}
int find(int x, int y)
{
int r,c;
r=x%3?(x/3+1):(x/3);
c=y%3?(y/3+1):(y/3);
return (r-1)*3+c;
}
1273 Drainage Ditches
q是一道比较单U的|络,题目要求只要求出源点到汇点的最大流p了,而ƈ不需要Q何的建模抽象的东西,唯一一点要注意的是Q要考虑有重边的情况?/span>
q里我用的是增广路法求的最大流Q流从源?/span>s出发Q用BFS扑ֈ一条增q\径,然后找这条\径上的最?/span>minQ对增广路进行扩展,每一ơ扩展会使得f[pre[i]][i]的值增大,那么它的反向路径f[i][pre[i]]的g减小Q一直进行下去,直到找不到增q\为止Q算法结束?/span>
Source
Problem Id:1273 User Id:linyangfei
Memory:240K Time:15MS
Language:C++ Result:Accepted
Source
#include <stdio.h>
#include <string.h>
int n,m,pre[205];
int f[205][205];
bool mark[205];
int bfs();
__int64 MaxFlow();
int main()
{
int i,s,e,c;
//freopen("1273.in","r",stdin);
while(scanf("%d%d",&m,&n)!=EOF)
{
memset(f,0,sizeof(f));
for(i=0; i<m; i++)
{
scanf("%d%d%d",&s,&e,&c);
if(f[s-1][e-1]==0)
f[s-1][e-1]=c;
else
f[s-1][e-1]+=c;
}
printf("%I64d\n",MaxFlow());
}
return 0;
}
int bfs()
{
int q[205],qt=0,qh=1,i,x,min;
q[qt]=0;
mark[0]=true;
while(qt<qh)
{
x=q[qt];
if(x==n-1)
{
min=100000000;
for(i=n-1; pre[i]!=-1; i=pre[i])
min=f[pre[i]][i]<min?f[pre[i]][i]:min;
return min;
}
for(i=1; i<n; i++)
{
if(!mark[i] && f[x][i]>0)
{
q[qh++]=i;
mark[i]=true;
pre[i]=x;
}
}
qt++;
}
return 0;
}
__int64 MaxFlow()
{
int i,min;
__int64 maxflow=0;
memset(mark,0,sizeof(mark));
for(i=0; i<n; i++)
pre[i]=-1;
while(min=bfs())
{
for(i=n-1; pre[i]!=-1; i=pre[i])
{
f[pre[i]][i]-=min;
f[i][pre[i]]+=min;
}
maxflow+=min;
memset(mark,0,sizeof(mark));
for(i=0; i<n; i++)
pre[i]=-1;
}
return maxflow;
}
1149 PIGS
也是一道很l典的网l流的题目,题目大意?/span>Mirko?/span>M个猪圈,猪圈里面有一定数量的猪,但他没有钥匙Q而只有来买猪的顾客才会有一些特定房间的钥匙Q每ơ顾客来之前Q都?/span>Mirko预约好,所?/span>Mirko的Q务就是找Z个计划,使他能卖出最多数量的猪。对于每位顾客,Mirko可以选择卖出猪的数量Q也可以在该֮打开的猪圈间L调整猪的数量Q每个猪圈的定w无限大?/span>
我觉得这个问题的一个关键点是徏模,如何建立一个网l流的模型很关键。我把所有的猪圈l一看成一个大的源?/span>SQ把每个֮看成是一个节点,然后再h工地d一个汇炏V这样可以得Z面的路径关系?/span>
1?nbsp;在先到的֮和后到的֮之间有一条\径,指向后到的顾客,q条路径的容量无限大?/span>
2?nbsp;在源Ҏ指向各个֮的\径,路径的容量֮ؓ拥有的钥匙所能打开的猪圈的猪的总量Q注意,当两个顾客拥有同一把钥匙的时候,猪圈的数量只能加C个顾客节点的路径上,不能重复加,他们之间的{Udpd?/span>1中两֮间容量无限大的\径来实现?/span>
我想有了q两点,把网l流的模型徏立v来后Q求解的法按照1273的模版就应该很容易了?/span>
#include <stdio.h>
#include <string.h>
const int INF=100000000;
int f[105][105],pig[1005],key[1005][105],pre[105];
bool mark[105];
int m,n;
int bfs();
int MaxFlow();
int main()
{
int i,j,c,p,k;
//猪圈看作一个大的源?/span>0Q再外加一个汇?/span>n+1
freopen("1149.txt","r",stdin);
while(scanf("%d%d",&m,&n)!=EOF)
{
for(i=1; i<=m; i++)
scanf("%d",&pig[i]);
memset(f,0,sizeof(f));
memset(key,0,sizeof(key));
for(i=1; i<=n; i++)
{
scanf("%d",&c); //每位֮拥有钥匙的数?/span>
for(j=1; j<=c; j++)
{
scanf("%d",&p); //输入每把钥匙的编?/span>
f[0][i]+=pig[p];
key[p][i]=1;
pig[p]=0;
}
scanf("%d",&c); //输入每位֮需要猪的数?/span>
f[i][n+1]=c;
}
for(i=1; i<=m; i++)
for(j=1; j<=n; j++)
{
if(key[i][j])
for(k=j+1; k<=n; k++)
{
if(key[i][k])
f[j][k]=INF;
}
}
printf("%d\n",MaxFlow());
}
return 0;
}
int bfs()
{
int q[205],qt=0,qh=1,i,x,min;
q[qt]=0;
mark[0]=true;
while(qt<qh)
{
x=q[qt];
if(x==n+1)
{
min=100000000;
for(i=n+1; pre[i]!=-1; i=pre[i])
min=f[pre[i]][i]<min?f[pre[i]][i]:min;
return min;
}
for(i=1; i<=n+1; i++)
{
if(!mark[i] && f[x][i]>0)
{
q[qh++]=i;
mark[i]=true;
pre[i]=x;
}
}
qt++;
}
return 0;
}
int MaxFlow()
{
int i,min;
int maxflow=0;
memset(mark,0,sizeof(mark));
for(i=0; i<=n+1; i++)
pre[i]=-1;
while(min=bfs())
{
for(i=n+1; pre[i]!=-1; i=pre[i])
{
f[pre[i]][i]-=min;
f[i][pre[i]]+=min;
}
maxflow+=min;
memset(mark,0,sizeof(mark));
for(i=0; i<=n+1; i++)
pre[i]=-1;
}
return maxflow;
}
q是我的W一?/span>DPQ题目的意思很单,在一个矩阵里面找它的子矩阵,使得子矩阉|g和到达最大。其实就是最大子D和问题在二l空间上的推qѝ先说一下一l的情况吧。设有数l?/span>a0,a1…an,N其中q箋的子D,使它们的和达到最大。最开始的xQ是枚D矩阵的长度,计算每个子矩늚和,然后比较得出最大|q样要消耗的旉?/span>O(n)。让我们再想惻I如果q个序列的每一个数都是整数Q那么它们的最大子D和是把所有的数相加。所以我们想要尽可能多地扑ֈ正数相加。在序列中有负数的情况下Q从头开始扫描数l,把正数都相加Q这其中可能会有负数Q一U情冉|Q负数和减小子段和,但这时子D和仍然为正Q用sum记录下连l子D和的最大|l箋惛_扫描Q因为后面有可能出现更大的正数的情况Q会使和比原来没加负C前更大;W二U情冉|Q加入一个负数后Q是q个q箋的子D和的值变成了负数Q这时就要抛弃该负数以及该负C前的所有序列,因ؓ前面若有子段与后面构成了q箋的子D,则这个子D一定会包括q个负数Q而在q个负数之前的序列的和是个负敎ͼ那么q个子段的和一定不是最大的子段和。抛弃这个负C前的序列后,子段和从q个负数后面的第一个数vQl扫描?/span>
//一l数l求最大字D?/span>
int submax1(int a[], int n)
{
int b=0;
int bn=-32767;
int i;
int sum=0;
for(i=0; i<n; i++)
{
if(b>0)
{
b+=a[i];
}
else if(a[i]>bn && a[i]<0)
{
bn=a[i];
b=a[i];
}
else
{
b=a[i];
}
if(b>sum)
{
sum=b;
}
}
if(sum==0)
return bn;
else
return sum;
}
其中变量b是记录当前扫描q的子段和的Q?/span>sum记录的是子段和的最大?/span>
二维的情况:
q里我用了一个很单的做法Q在二维数组a[i][j]里面枚DW一l的长度kQ然后得C?/span>k*n的子矩阵Q把q个子矩늚每一列数值相加,把q个二维数组转化成了一l_再调用函?/span>int submax1(int a[], int n)Q就计算得出最大倹{?/span>
ȝQ感觉我做这道题目还不是很像DPQ只有在求一l情况下?/span>sum记录最大|以及在扫描是计算的子D和bQ代表了某数前面q箋的最大子D和?/span>
二?/span>1579 Function Run Fun
q肯定是一个处心积虑的函数Q没看出它有什么实际的用处
Consider a three-parameter recursive function w(a, b, c):
if a <= 0 or b <= 0 or c <= 0, then w(a, b, c) returns: 1
if a > 20 or b > 20 or c > 20, then w(a, b, c) returns: w(20, 20, 20)
if a < b and b < c, then w(a, b, c) returns: w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c)
otherwise it returns: w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1)
q本w就是一个递归函数Q要是按照函数本w写递归式,l果肯定?/span>TLEQ这里我开了一个三l数l,?/span>w(0,0,0)开始递推Q逐步产生?/span>w(20,20,20)的|复杂?/span>O(n^3)
ȝQ这道题是很地道?/span>DPQ因为它的子问题实在是太多了Q但q是属于单题目的范畴Q就像把fabonacci函数增加Cl_限制条g多点而已Q而实际上的做法都一栗?/span>
三?/span>1080 Humman Gene Function
应该说这是一道比较经典的DPQ两串基因序列包?/span>A?/span>C?/span>G?/span>TQ每两个字母间的匚w都会产生一个相似|求基因序列(字符Ԍ匚w的最大倹{?/span>
感觉q题有点像求最长公共子序列。只不过把求最大长度改成了求最大的匚w倹{用二维数组m[i][j]记录字符?/span>a中的W?/span>i个字W与字符?/span>b中的W?/span>j个字W匹配所产生的最大倹{若字符?/span>a的长度ؓlaQ字W串b的长度ؓlbQ初始时m[la][k](0<=k<=lb-1),q里即ؓ字符?/span>a的末与b中的字符匚wQ因q了字符?/span>a的长度,所以匹配的时候只能时以空?/span>’-’匚w。同理可产生m[k][lb](0<=k<=la-1)Q的所有|再以此往前递推Q其状态{ULEؓ
m[i][j]=max{map[i][j]+m[i+1][j+1],m[‘-‘][j]+m[i][j+1],m[i][‘-’]+m[i+1][j]}
所以最?/span>m[0][0]即ؓ所求?/span>
四?/span>2533 Longest Ordered Subsequence
很早以前qq这题,求最大递增序列Q那时刚刚晓得什么叫“动态规?#8221;Q是《算法设计与分析》(王晓东)上的一道习题,开始不会做。后来想了一U很W的办法Q用?/span>O(n^2)的时_q附加了n^2的空间。看了世铭的两种ҎQ一U是O(n^2),一U是O(nlogn)。两U方法核心的Ҏ都一P用一?/span>n大小的一l空?/span>(a[n])Q?/span>a[i]表示子串长度?/span>i时所有子串最大g的最|因ؓ要找一?/span>i长度的子Ԍ那么a[i]的D要比长度ؓi-1子串中的一个最末位的D大。之所以会有两U时间复杂度的差别,是在查?/span>i-1长度的末րg的最值的时候,前者是U性的搜烦Q后者是用的二分搜烦Q提高了旉效率。另外说一下这题的变Ş吧,1631 Briging signalsQ是有很多\由器搭线Q要求求Z不相交的搭配的最大个数。细l分析一下题目,只要被匹配的路由器序h一个递增的序列,则他们的q线׃会相交,把q题转化为求最大递增序列的问题。但需要注意的是这题的问题规模n辑ֈ?/span>40000Q?/span>Time Limit :1000MSQ所以在q里要选用刚才提到?/span>O(nlogn)的算法,才不会导?/span>TLE?/span>
五?/span>1014 Dividing
实际上早q到这题了Q那时对ACM的认识还很幼E,刚学完程序设计,学会怎么用递归Q也不看题目的条Ӟ反正是六种marbleQ写了个递归的程序,试数据当然能通过Q但其结果肯定是TLE了。又q了一D|_有了Ҏ间效率的观念Q写了个枚D法计d?/span>1/2的可达性,不过q是有很多情冉|都没有考虑刎ͼl果WA了。到现在?/span>DPQ再来看xq题Q其实还有更好的解法。也是计d?/span>1/2(sum)的可达性,如果marble的L?/span>nQ则DP法的时间复杂度可以辑ֈO(n*sum)。用一个一l数l标C0Q?/span>sum所有加和的可达性,对于一颗宝石的价?/span>iQ数l?/span>a[j]==trueQ表C和?/span>j可达Q那么可得出
a[i+j]=true,?/span>i+j的值可达。@环以致于用完所有的宝石Q观?/span>a[sum]的|true即ؓq些宝石可分Q反之不可分?/span>
六?/span>2192 Zipper
又是一道字W串的动态规划题目,qC下:l出三个字符Ԍs1,s2,s3Q?/span>s3的长度ؓs1?/span>s2长度之和Q判?/span>s1Q?/span>s2是否?/span>s3的不重合的公共子序列。其实就是判别公׃序列的升U版Q把原来的一对一Q改成了一对二。我用一个二l数l?/span>mark[i][j]记录s1中的W?/span>i个字W以?/span>s2中的W?/span>j个字W能否与s3[i+j]惛_配?/span>
If(s1[i]==s3[i+j]) mark[i+1][j]=true;//s1中的W?/span>i个字W匹配,?/span>s1串向后移一个字W?/span>
If(s2[j]==s3[i+j]) mark[i][j+1]=true;//s2中的W?/span>j个字W匹配,?/span>s2串向后移一个字W?/span>
q样?/span>O(n^2)的时_递推能?/span>mark[c1][c2]的|gؓtrue输出卌够全部匹配?/span>
七?/span>2576 Tug of War
我觉得非常有必要做的一道题目。这道题目看似很单,实质是n个数Q将其分成两堆,两堆数量的差距不过1Qƈ且ɘq两堆数字之和最接近。是一道动态规划题目,看v来简单是因ؓ受了1014题的影响Q但q题两堆的数目是定的,一堆是n/2个,另一堆则?/span>n-n/2?/span>,?/span>1014题是不受加和数目的媄响的。这题也不同与多c_骨牌那题Q因为那题中各个数字之间是一一对应的。苦想了一天没有结果,看来q题q要L其它的方法。这题不是我自己想除来的Q看?/span>alpc02的代码,自己又照自己的理解重写了一遍?/span>
记录状态是用一个二l数l,mark[i][j]表示i个数相加Q其D否达?/span>jQ如果能mark[i][j]的ؓtrue。对于一个输入的?/span>wQ修?/span>i个数的每一U状态,其状态{ULE:
If(m[i][j]) then m[i][j+w]=true;//j+w的值可?/span>j的值加?/span>
由后往前修Ҏ一?/span>i下的可达倹{那么最后就只要?/span>n/2行中扑ևm[n/2][j]的最大|j<=total/2Q,q就是两堆之和最接近的一l数倹{?/span>
八?/span>2441 Arrange the Bulls
q题里我看到了动态规划的一U新的方法。每头牛有自己喜Ƣ的球场,我们的Q务就是安排这些牛到它们喜Ƣ的球场去Q然后计所有合理的解的数量Q篮球场的数目最?/span>20个)。显Ӟ要找C个解Q很Ҏp搜出Q但是要求所有解的数量,如果再用搜烦的方法,在时间上是不堪忍受的。这里用了一U新的方法(对于我来说是一U新Ҏ^_^Q。用二进制数记录当前球Z用的状态,“
一U是用滚动数l,q种Ҏ占用旉I间都较大,另一U是状态压~的DPQ方法比较y妙?em>呵呵Q要讲得更深点,{我变成牛h在箋?#8230;…
九?/span>2738 Two Ends
有点惛_弈的题目Q我事用dp来做的。有一l数Q两个h分别轮流从数l两头取敎ͼW一个取数的人可以选用L的策略,W二个h则要一直用贪心策略。问最后第一个h所取得的数字之和比W二个h取得的数字之和最多多多少?/span>
很容易想?/span>DPQ第二个人的取数规则是一定的Q只有第一个个人可以选择Q那么在W一个h取数的时候就有状态{ULE,dp[i][j]表示前面是第i个数后面是第j个数的时候第一个h所能得到数字和的最大倹{?/span>
if(dp[i][j]+a[i]>dp[i+1][j])
dp[i+1][j]=dp[i][j]+a[i]; //取前面的?/span>
if(dp[i][j]+a[j]>dp[i][j-1])
dp[i][j-1]=dp[i][j]+a[j]; //取后面的?/span>
那么W二个h的状态{Ud相对比较好确定了Q?/span>
if(a[i]<a[j] && dp[i][j]!=-1 && dp[i][j]>dp[i][j-1])
dp[i][j-1]=dp[i][j];
if(a[i]>=a[j] && dp[i][j]!=-1 && dp[i][j]>dp[i+1][j])
dp[i+1][j]=dp[i][j];
最后一步只需比较dp[i][i]的|选其中最大的出来p?/span>^_^