投票

第一题 投票

提交文件:vote.pas/c/cpp

输入文件:vote.in

输出文件:vote.out

问题描述

有n个候选人要竞选主席,有m个人要投票。每个人只能投一票,如果某个人投了超过一票或者不投票,那么这个人的投票将视为非法。

给出m个人的投票情况,你的任务是统计投票情况,然后按照获得投票数从高到低将候选人排序,如果获得的投票数相同,则按照候选人的输入顺序从小到大排序。

 

输入格式

第一行一个整数n,m(2<=n<=10,1<=m<=1000),分别表示候选人的数量和投票人的数量。

接下来n行,每行有一个字符串,表示候选人的名字,保证字符串长度不超过100,且不包含"Invalid"这个名字。

接下来m行,每行一个长度为n的字符串,表示一个人的投票情况,字符串仅包含“X”和”.”。若字符串的第i个位置为”X”,则表示这个人给第i个候选人投一票。

 

输出格式

一共n+1行,前n行每行的信息分别为候选人的名字以及它所获的票占总票数的百分比,名字和百分比用一个空格隔开。其中百分比要四舍五入保留两位小数。

最后一行输出非法票数占总票数的比例,非法票数的名字用"Invalid"表示,具体看请看样例输出。

 

输入样例:

输出样例:

4 7

Loudy

Apples

Dogman

Miller

.X..

X...

....

..X.

..XX

..X.

..X.

Dogman 42.86%

Loudy 14.29%

Apples 14.29%

Miller 0.00%

Invalid 28.57%

 

 

数据范围

100%的数据,n<=10,m<=1000

 

分析:

暴力模拟双单位字排序。注意四舍五入、、


代码:

const
  maxn=10;


var
  a,sum:array [0..maxn+1] of longint;
  name:array [0..maxn] of string;
  n,m:longint;


function check(s:string):boolean;
begin
  delete(s,pos('X',s),1);
  if pos('X',s)>0 then
    exit(true);
  exit(false);
end;


procedure sort;
var
  i,j,k:longint;
begin
  for i:=1 to n do
    for j:=i+1 to n do
      if sum[i]<sum[j] then
        begin
          k:=a[i];
          a[i]:=a[j];
          a[j]:=k;
          k:=sum[i];
          sum[i]:=sum[j];
          sum[j]:=k;
        end
      else
        if (sum[i]=sum[j]) and (a[i]>a[j]) then
          begin
            k:=a[i];
            a[i]:=a[j];
            a[j]:=k;
            k:=sum[i];
            sum[i]:=sum[j];
            sum[j]:=k;
          end;
end;


procedure init;
var
  i:longint;
  s:string;
  r:real;


begin
  readln(n,m);
  for i:=1 to n do
    begin
      readln(name[i]);
      a[i]:=i;
    end;
  for i:=1 to m do
    begin
      readln(s);
      if pos('X',s)=0 then
        begin
          inc(sum[n+1]);
          continue;
        end;
      if check(s) then
        begin
          inc(sum[n+1]);
          continue;
        end;
      inc(sum[pos('X',s)]);
    end;
  sort;
  for i:=1 to n do
    begin
      r:=sum[i]/m;
      if r*10000-trunc(r*10000)>=0.5 then
        r:=trunc(r*10000+1)
      else
        r:=trunc(r*10000);
      writeln(name[a[i]],' ',r/100:0:2,'%');
    end;
  r:=sum[n+1]/m;
  if r*10000-trunc(r*10000)>=0.5 then
    r:=trunc(r*10000+1)
   else
     r:=trunc(r*10000);
  writeln('Invalid ',r/100:0:2,'%');
end;


begin
  assign(input,'vote.in');reset(input);
  assign(output,'vote.out');rewrite(output);
  init;
  close(input);close(output);
end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值