//前言:今天好困好困,写完博客放风。
第一题;
一、安全密码
问题描述:
密码在我们日常生活中经常要用到,如邮箱密码、QQ密码等,设置一般的密码很容易破解的哦,千万不要用你的出生年月作为你的密码,那样很不安全。小K用到了一种比较安全的密码设置方法:密码由三个正整数a,b,c经过计算a的b次方除以c的余数得到。现在请你编写一个程序,计算ab mod c 的值。
数据输入:
从文件password.in中读入数据,文件中只有一行,依次为三个正整数a,b,c,三个正整数之间用空格隔开。
数据输出
结果输出到文件password.out中,只有一个数,表示计算得到的结果。
输入输出样例
password.in
2 3 7
password.out
1
数据范围说明:
60%的数据中,a的b次方的值在longint范围内。
70%的数据中,a的b次方的值在int64范围内.
100%的数据中,a,b,c 的值小于1000 。
思路:这道题似乎很水,当然啦,这题不水我就歇逼翻车凉了。用分治思想,结合二进制……这不是例题吗?var
i,k,a,b,c,l,ans:longint;
math:array[0..10000]of integer;
procedure into(i:longint);
begin
while i<>0 do
begin
inc(l);
math[l]:=i mod 2;
i:=i div 2;
end;//二进制的转换
end;
begin
assign(input,'password.in');
assign(output,'password.out');
reset(input);rewrite(output);
read(a,b,c);
into(b);
ans:=1;
for i:=l downto 1 do
begin
k:=ans*ans mod c;
if math[i]=1 then ans:=(k mod c)*(a mod c)mod c//这其实是一条公式
else ans:=k;
end;
writeln(ans);
// for i:=l downto 1 do write(math[i]);
close(input);
close(output);
end.
第二题:
二、农场主
问题描述:
小张是一个养马农场的农场主,他要把N只马分配到K个马房里,放置的规则是:第1到 第Pi只马放入第一个马房,第Pi+1 到第Pk只放入第二个马房,......以此类推。此外对于每一个马房都有一个叫做“不高兴系数”,即白色马的数量*黑色马的数量。你的任务是合理地分配这N只马,使得它所有马房的“不高兴系数”和最小。
数据输入:
从文件farmer.in中读入数据,文件中第一行有 2 个整数: N( 1 <= N <= 500 ) 和 K( 1 <= K <= N)。接下来的N行有N个数。第 I 行为第 I 只马的颜色: 1 是黑色, 0 是白色。
数据输出:
将结果输出到文件farmer.out中,其结果为最小的“不高兴系数”的总和。
输入输出样例:
farmer.in
6 3
1
1
0
1
0
1
farmer.out
2
这题一到手——蒙蔽!看见DP就想各种&*(……*(!%&……!@#%&¥&自己,后来改了一个下午总算改出来也是万幸。
思路:首先你需要一个前缀和,也就是计算当*只B(黑马)和¥只W(白马)在一起时是个什么样的心情求出来,作为
DP数组f的第一行,然后我们可以通过枚举笼子计算min值,采用已有的f[i-1,m]和后来来的动物心情为值,覆盖
前面的那个解f[i,j],以此来找到最优的解。有f[i,j]:=f[i-1,m]+(b[j]-b[m])*(w[j]-w[m]);m的变值表示为你还可以
拉进来的马,即可选区间范围。所以记得要是*[j]-*[m],听说很多小伙伴在此翻车。
var
f:array[0..501,0..501]of longint;
a,b,w:array[0..501]of longint;
i,j,k,n,m,min,sumb,sumw:longint;
begin
readln(n,k);
for i:=1 to n do
begin
read(a[i]);
if a[i]=1 then inc(sumb)
else inc(sumw);
b[i]:=sumb;w[i]:=sumw;
f[1,i]:=b[i]*w[i];
end;
for i:=2 to k do
for j:=i to n-k+i do
begin
min:=maxlongint;
begin
for m:=i-1 to j-1 do
begin
f[i,j]:=f[i-1,m]+(b[j]-b[m])*(w[j]-w[m]);
if f[i,j]<min then min:=f[i,j];
end;
end;
f[i,j]:=min;
end;
write(f[k,n]);
end.
2012年特长生试题一 营救
Time Limit:10000MS Memory Limit:65536K
Total Submit:72 Accepted:37
Case Time Limit:1000MS
Description
铁塔尼号遇险了!他发出了求救信号。距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快赶到那里。
通过侦测,哥伦比亚号获取了一张海洋图。这张图将海洋部分化成n*n个比较小的单位,其中用1标明的是陆地,用0标明是海洋。当然,船只能在海洋上行驶,且船只能从一个格子,移到相邻的四个格子。
为了尽快赶到出事地点,哥伦比亚号最少需要走多远的距离。
Input
从文件save.in中读入数据,第一行为n,下面是一个n*n的0,1矩阵,表示海洋地图,最后一行为四个小于n的整数,分别表示哥伦比亚号和铁塔尼号的位置。
Output
哥伦比亚号到铁塔尼号的最短距离,答案精确到整数。
Sample Input
3
001
101
100
1 1 3 3
Sample Output
4
Hint
数据范围说明:N<=1000。
Source
elba
广搜,注意布尔型。
const
fx:array[1..4]of longint=(-1,0,1,0);
fy:array[1..4]of longint=(0,-1,0,1);
var
i,j,sy,sx,rx,ry,n:longint;
a:array[0..1001,0..1001]of char;
f:array[0..1000001,0..3]of longint;
procedure bfs;
var
tail,head,x,y:longint;
begin
tail:=1; head:=0;
f[1,1]:=sx;f[1,2]:=sy;
a[sx,sy]:='1';
repeat
inc(head);
for i:=1 to 4 do
begin
x:=f[head,1]+fx[i];
y:=f[head,2]+fy[i];
if (x>0)and(x<=n)and(y>0)and(y<=n)and(a[x,y]='0')
then begin
inc(tail);
f[tail,1]:=x;
f[tail,2]:=y;
f[tail,3]:=f[head,3]+1;
a[x,y]:='1';
if (x=rx)and(y=ry) then begin
write(f[tail,3]);
close(input);close(output);
halt;
end;
end;
end;
until head>=tail;
end;
begin
assign(input,'save.in');reset(input);
assign(output,'save.out');rewrite(output);
readln(n);
for i:=1 to n do begin
for j:=1 to n do read(a[i,j]);
readln;
end;
read(sx,sy,rx,ry);
bfs;
end.