12特长生

本文介绍了三道算法题目,包括安全密码的计算方法、农场主的马匹分配问题及救援行动中的路径寻找算法。每道题目都给出了详细的解题思路与代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//前言:今天好困好困,写完博客放风。

第一题;

一、安全密码

问题描述:

密码在我们日常生活中经常要用到,如邮箱密码、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.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值