中山纪念中学套题(1)

哈哈哈,本博客的第一张,讲的就是我在中山纪念中学的一套普及组的题目。

---------------------------------------------------------------------------------------------------------------------------------    我是可爱华丽的分界线~~

 

       【探索的奶牛】

 FJ的奶牛喜欢探索农场周围的地形。一开始,所有N(1<=N<=1,000,000,000)只奶牛一起出发,但当碰到路口时,这一群牛可能会分成两部分(不能为空),每一部分都继续前进,当碰到另一个路口时,再分成两部分,如此反复下去。。。

-假设路上到处都是新的岔口,计算最终被分成多少支队伍。

 

 

第1行: 两个用空格隔开的整数:N,K(分裂时两个小组的人数差为K)。

 

第1行: 输出一个整数表示最终的队伍数

 

输入:6 2

 

输出:3

 题解:

本题中因为每次分裂的人数是一定,所以每次分裂的人数都是一定的,然后每次只会有两个分叉口那就很简单了,只需要枚举就好了,一边是((l –m) shr 1 ),另一边就是l-((l-m)  shr 1);然后就没有然后了。。。。。

<pre name="code" class="plain">var
 i,j,n,m,ans:longint;
procedure dfs(l:longint);
var
 i,j:longint;
begin
 ifl>=m+1 then
  if(l-m) mod 2=0 then
 begin
  inc(ans);
  dfs((l-m) shr 1);
  inc(ans);
  dfs(l-((l-m) shr 1));
 end;
end;
 
 
begin
 readln(n,m);
 dfs(n);
 ans:=ans shr 1+1;

writeln(ans);


 


 
 


---------------------------------------------------------------------------------------------------------------------------------我是可爱华丽的分界线~~

 

【单词】

 FJ想计算他的N(1<=N<=1000)只奶牛的名字的好听度,每个名字是一个长度不超过1000的英文字母组成。

他创建了一个好名字的集合,数量为M(1<=M<=100),每个好名字的长度不超过30,奶牛的名字中每包含一个好名字(“包含”不一定要求连续),那么它的好听度就加1.

所有的名字都不区分大小写,如名字“Bessie”包含“Be”、“sI”、“EE”、“Es”,但是不包含“eB”。

现在请你帮FJ计算每个奶牛名字的好听度。

 

输入

第1行: 2个用空格隔开的整数:N 和 M;

 

第2..N+1行: 第i+1为第i个奶牛的名字;

 

第N+2..N+M+1行:第N+i+1行为第i个好名字。

 

输出

第1..N行:第i个数为第i头奶牛名字的好听度。

 

样例输入

5 3

Bessie

Jonathan

Montgomery

Alicia

Angola

se

nGo

Ont

样例输出

1

1

2

0

1

 

 

题解

对于一个1000*100的数据,直接暴力枚举,不过要枚举好听的名字在牛的名字里有没有出现,时间复杂度1000*100*30 差不多压点过。

 

程序如下:

const
 maxn=1000;
var
 s:array [0..maxn] of ansistring;
 s1:array [0..100] of string;
 i,j,n,m,o,maxo,k,ans,ii:longint;
 flag:boolean;
 hjy:ansistring;
begin
 readln(n,m);
 fori:=1 to n do
 begin
 readln(s[i]);
 s[i]:=upcase(s[i]);
 end;
 fori:=1 to m do
 begin
 readln(s1[i]);
 s1[i]:=upcase(s1[i]);
 end;
 
 fori:=1 to n do
 begin
 ans:=0;
  forj:=1 to m do
  begin
   o:=0;
   for k:=1 to length(s1[j]) do
   begin
    flag:=false;
    for ii:=o+1 to length(s[i]) do
     if s[i,ii]=s1[j,k] then
      begin
       o:=ii;
       flag:=true;
       break;
      end;
     if flag=false then break;
   end;
   if flag=true then inc(ans);
  end;
 writeln(ans);
 end;
end.

 

 

---------------------------------------------------------------------------------------------------------------------------------我是可爱华丽的分界线~~

【牛车】

高速公路上有N(1<=N<=50,000)只奶牛,编号为1..N,每头牛都开着自己的车,第i头牛的车速为S_i(1<=S_i<=1,000,000)km/h,告诉公路上一共有M个车道(1<=M<=N)。



为了安全起见,每头牛都遵循以下原则:同车道前面有x头牛,牛的车速就会降低D*X(0<=D<=5,000)KM/h,当然不会降到0以下,所以车速应该max(S_i-D*X,0)。由于车距很大,所以即使后面的车比前面的车快,你也不用担心会发生碰撞。



高速公路上有一个最低限速L(1<=L<=1,000,000),凡是低于该速度的车不允许上高速,现在请你来计算一共可以多少辆车在高速公路上行驶。

 

输入

第1行: 4个空格隔开的整数N,M,D,L

 

第2..N+1行: 第i+1行描述第i头牛的起初车速。

 

输出

第一行: 输出一个整数表示最多可以在高速上行驶的牛车数量。

 

样例输入

3 1 1 5

5

7

5

 

 

样例输出

2

 

贪心,从小到大排序。每个车道只要可以放得下车那就放,放不下就到下一个车道,直到没有为止,有就可以加一。

 

var
       a,v:array[1..50000] of longint;
       n,m,d,l,i,j,ans:longint;
procedure qsort(l,r:longint);
var
       i,j,mid,p:longint;
begin
       i:=l;
       j:=r;
       mid:=v[(i+j) div 2];
       repeat
                while v[i]<mid do inc(i);
                while v[j]>mid do dec(j);
                if i<=j then
                begin
                        p:=v[i];
                        v[i]:=v[j];
                        v[j]:=p;
                        inc(i);
                        dec(j);
                end;
       until i>j;
       if l<j then qsort(l,j);
       if i<r then qsort(i,r);
end;
begin
       readln(n,m,d,l);
       for i:=1 to n do
                readln(v[i]);
       qsort(1,n);
       j:=0;
       for i:=1 to n do
       begin
                inc(j);
                if j>m then j:=1;
                v[i]:=v[i]-a[j]*d;
                if v[i]>=l then
                begin
                        inc(a[j]);
                        inc(ans);
                end
                else dec(j);
       end;
        writeln(ans);
end.

 

---------------------------------------------------------------------------------------------------------------------------------我是可爱华丽的分界线~~

 

【危险系数】

 FJ在一条船上,海上有N(1<=N<=100)岛,编号为1..N,现在他的任务是按照一个给定访问次序A_1,A_2,.A_M去探索这M(2<=M<=10,000)个岛屿,已经知道任意两个岛屿之间的危险系数,让你找出一个探索序列,只需满足你的探索序列包含给定的A_1..A_M这个序列就可以(不一定要连续),使得总的危险系数最小。

 

输入

第1行: 两个数, N 和 M

 

第 2..M+1行: 第i+1行表示给定的序列中第i个岛屿A_i

 

第M+2..N+M+1行:每行N个整数,表示岛屿之间的危险系数,对角线上一定是0。

 

输出

输出满足要求的最小危险系数

 

样例输入

3 4

1

2

1

3

0 5 1

5 0 2

1 2 0

 

样例输出

7

 

最短路,别的不多说了,很简单的。。。。

 

var
 f:array [1..1000,1..1000] of longint;
 n,i,j,k,ans,m:longint;
 a:array [1..100000] of longint;
function max(x,y:longint):longint;
 begin
  ifx>y then exit(y)
        else exit(x);
 end;
begin
 readln(n,m);
 fori:=1 to m do
 read(a[i]);
 fori:=1 to n do
  forj:=1 to n do
  read(f[i,j]);
 fork:=1 to n do
  fori:=1 to n do
  for j:=1 to n do
   if (i<>j) and (i<>k) and (j<>k) then
    begin
     f[i,j]:=max(f[i,j],f[i,k]+f[k,j]);
    end;
 fori:=1 to m-1 do
 begin
  ans:=ans+f[a[i],a[i+1]];
 end;
 writeln(ans);
end.

 

 



  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 29
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值