T1
题目描述
假如说一场比赛包含8道不同分值的题目,每位选手可以自己选择所要做的题目。但是,他们的最后总得分是其中得分最高的5个题目的分数之和。
现在给出某位选手每道题目的得分,请算出这位选手的最后总得分,同时列出得分最高的5个题目的序号,序号按照从小到大排列。
思路:排序,水题一道。。。。。。
代码:
var a,b:array[-1..11] of longint;
i,j:longint;
begin
assign(input,'najboljih5.in');
assign(output,'najboljih5.out');
reset(input);
rewrite(output);
for i:=1 to 8 do begin read(a[i]); b[i]:=i; end;
for i:=1 to 7 do
for j:=i+1 to 8 do
if a[i]then
begin
a[0]:=a[i]; a[i]:=a[j]; a[j]:=a[0];
b[0]:=b[i]; b[i]:=b[j]; b[j]:=b[0];
end;
for i:=1 to 4 do
for j:=i+1 to 5 do
if b[i]>b[j] then
begin
//a[0]:=a[i]; a[i]:=a[j]; a[j]:=a[0];
b[0]:=b[i]; b[i]:=b[j]; b[j]:=b[0];
end;
write(a[1]+a[2]+a[3]+a[4]+a[5]);
writeln;
for i:=1 to 5 do write(b[i],' ');
close(input);
close(output);
end.
T2
题目描述
Mirko 刚开始学车,因此他还不会在一个很狭窄的地方掉头,所以他想找一个不需要掉头的地方学车。Mirko马上发现他想找的地方必须没有死胡同,因为死胡同是不可能出来的,除非掉头(假设Mirko也不会倒车)。现在,你需要写一个程序,来分析一个地方的地图,研究是否这个地方适合Mirko练习开车。
这张地图是包含R*C个单元格的,单元格中的“X”代表一个建筑物,单元格中的“.”代表路面。从一个路面单元格,Mirko可以向旁边上下左右四个方向的单元格开去,只要开过去的地方同样也是路面。
最后,我们要得出这个地图是否包含死胡同,假如从任意一个路面单元格出发,沿着任何一个可以行驶的方向,我们可以不用掉头就能返回到出发点,那么这个地图就是没有死胡同的。
思路:
一开始的思路是dfs,结果只得了90。
其实有更简单的方法,判断空地上下左右有多少'x',<=2则不是死胡同
代码:
var a:array[0..11,0..11] of char;
n,m,i,j,t:longint;
procedure quit;
begin
close(input);
close(output);
halt;
end;
begin
assign(input,'okret.in');
assign(output,'okret.out');
reset(input);
rewrite(output);
readln(n,m);
for i:=1 to n do begin for j:=1 to m do read(a[i,j]); readln; end;
for i:=1 to n do
for j:=1 to m do
if(a[i,j]='.') then
begin
t:=0;
if a[i+1,j]<>'.' then inc(t);
if a[i-1,j]<>'.' then inc(t);
if a[i,j+1]<>'.' then inc(t);
if a[i,j-1]<>'.' then inc(t);
if t>2 then begin write(1); quit; end;
end;
write(0);
quit;
end.
T3
题目描述
Mirko最近收到了一个家庭作业,作业的任务是计算两个数A和B的最大公约数。由于这两个数太大了,我们给出了N个数,他们的乘积是A,给出M个数,他们的乘积是B。
Mirko想要验算自己的答案,所以他想找你写一个程序来解决这个问题。如果这个最大公约数超过了9位数,那么只需要输出最后9位就可以了。
思路:
1.分解质因数
可是x<=1000000000,会爆。。。。。。
2.两两求质因数,再相乘
可是不知为啥我只有20分
T4
题目描述
在顺利完成家庭作业以后,Mirko感到非常的厌倦。所以,他列出了N个数,这些数中有些数对他是喜欢的,有些数对他是不喜欢的。
他喜欢的数对叫做友好数对,如果两个数至少有一个相同的数字(不要求在相同的位置),那么这两个数就是友好数对。请帮助Mirko在这N个数找出有多少友好数对。
思路:
容斥原理
先把数拆分,用二进制表示
再用容斥原理求解
代码:
var ans:int64;
// a:array[0..11] of longint;
b:array[0..10000] of longint;
procedure init;
var i,n,t,s,j,k:longint;
x:int64;
begin
assign(input,'kompici.in');
assign(output,'kompici.out');
reset(input);
rewrite(output);
read(n);
for i:=1 to n do
begin
s:=0;
t:=0;
//fillchar(a,sizeof(a) ,0);
read(x);
while x>0 do
begin
t:=x mod 10;
x:=x div 10;
s:=s or (1 shl t);
end;
inc(b[s]);
end;
end;
procedure rc;
var i,j:longint;
begin
for i:=1 to 1023 do
begin
if b[i]=0 then continue;
for j:=1 to 1023 do
begin
if (i and j=0)or(b[j]=0)or(i=j) then continue;
ans:=ans+b[i]*b[j];
end;
ans:=ans+b[i]*(b[i]-1);
end;
ans:=ans div 2;
end;
begin
init;
rc;
write(ans);
close(input);
close(output);
end.