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]<a[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; 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.