哈哈哈,本博客的第一张,讲的就是我在中山纪念中学的一套普及组的题目。
--------------------------------------------------------------------------------------------------------------------------------- 我是可爱华丽的分界线~~
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);然后就没有然后了。。。。。
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 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 lm 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.