首页 > 试题广场 >

记票统计

[编程题]记票统计
  • 热度指数:124314 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
请实现一个计票统计系统。你会收到很多投票,其中有合法的也有不合法的,请统计每个候选人得票的数量以及不合法的票数。
(注:不合法的投票指的是投票的名字不存在n个候选人的名字中!!)

数据范围:每组输入中候选人数量满足 ,总票数量满足

输入描述:

第一行输入候选人的人数n,第二行输入n个候选人的名字(均为大写字母的字符串),第三行输入投票人的人数,第四行输入投票。



输出描述:

按照输入的顺序,每行输出候选人的名字和得票数量(以" : "隔开,注:英文冒号左右两边都有一个空格!),最后一行输出不合法的票数,格式为"Invalid : "+不合法的票数。

示例1

输入

4
A B C D
8
A D E CF A GG A B

输出

A : 3
B : 1
C : 0
D : 1
Invalid : 3

说明

E CF GG三张票是无效的,所以Invalid的数量是3. 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    int a, b;
    int invalidcnt=0;
    scanf("%d",&a);
    int cnt[a];
    char *A[a+1];
    for(int i=0;i<a;i++)
    {
        cnt[i]=0;
        A[i]=(char*)malloc(sizeof(char)*100);
        scanf("%s",A[i]);
    }
    scanf("%d",&b);
    char *B[b+1];
    for(int i=0;i<b;i++)
    {
        B[i]=(char*)malloc(sizeof(char)*100);
        scanf("%s",B[i]);
    }

        
    for(int i=0;i<b;i++)
    {
        int valid=0;
        for(int j=0;j<a;j++)
        {
            if(!strcmp(B[i], A[j]))
            {
                //printf("%s  有效\n",B[i]);
                valid=1;
                cnt[j]++;
                break;
            }

        }
        if(valid==0)
            invalidcnt++;
    }
    for(int i=0;i<a;i++)
    {
        printf("%s : %d\n",A[i],cnt[i]);
    }
    printf("Invalid : %d",invalidcnt);
    return 0;
}

编辑于 2024-03-09 16:32:23 回复(0)
#include<stdio.h>
#include<string.h>
int main() {
    int n, m;
    char name[101][32];
    while (~scanf("%d", &n)) {

        for (int i = 0; i < n; i++)
            scanf("%s", name[i]);
        sscanf("Invalid","%s",name[n]);//初始化n+1

        scanf("%d", &m);
        int sum[101] = {0};//统计票数
        for (int i = 0; i < m; i++)
        {
            char vote[32];
            scanf("%s", vote);
            int j = 0;
            for (j = 0; j < n; j++)
            {
                if (strcmp(vote, name[j]) == 0)
                {
                    break;
                }    
            }  
            sum[j]++;
        }
        for (int i = 0; i <= n; i++)
        {
            printf("%s : %d\n", name[i], sum[i]);
        }
    }
}

发表于 2023-10-14 00:05:52 回复(0)
#include <stdio.h>
#include <stdlib.h>

typedef struct candidate{
    char name[15];
} cdd;

int trans(char *a){
    int sum=0,i;
    for(i=0;a[i]!='\0';i++){
        sum+=a[i];
    }
    return sum;
}

int main() {
    int n,i,m,invalid=0;  //n个候选人,m张票
    scanf("%d",&n);
    cdd a[100];
    int hash[1000]={0};
    for(i=0;i<n;i++){
        scanf("%s",a[i].name);
        hash[trans(a[i].name)]=1;
    }
    scanf("%d",&m);
    char vote[13];
    for(i=0;i<m;i++){
        scanf("%s",vote);
        int s=trans(vote);
        if(hash[s]==0) invalid++;
        else hash[s]++;
    }
    for(i=0;i<n;i++){
        printf("%s : %d\n",a[i].name,hash[trans(a[i].name)]-1);
    }
    printf("Invalid : %d\n",invalid);

    return 0;
}
使用哈希函数,时间复杂度O(n)。

发表于 2023-03-28 20:55:48 回复(0)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct people{
    char* name;
    int ticket;
    struct people* next;
};

//使用链表的形式存储候选人

int main() {
    int n, m, invaild = 0;
    struct people head;         //创建链表头
    char name[100];
    struct people* cur = &head; //链表当前指针
    scanf("%d", &n);
    for(int i=0; i<n; i++){
        scanf("%s", name);  //获取候选人名字
        struct people *tmp = (struct people*)malloc(sizeof(struct people)); //动态申请节点
        tmp->name = (char*)malloc(sizeof(char)*100);    //为节点的候选人名称申请空间
        strcpy(tmp->name, name);                    //候选人名称赋值
        tmp->ticket = 0, tmp->next = NULL;                     //初始节点
        cur->next = tmp;                                        //将新节点加入链表
        cur = cur->next;
    }
    
    scanf("%d", &m);
    for(int i=0; i<m; i++){
        scanf("%s", name);      //获取投票信息
        cur = head.next;                //cur指向链表第一个节点
        while(cur){                 //遍历链表
            if(strcmp(name, cur->name) == 0){//找到对应的候选人,
                cur->ticket++;                      //票数加1
                break;                              //跳出循环
            }
            cur = cur->next;
        }
        if(!cur)invaild++;          //找不到对应候选人,不合法票数+1
    }

    cur = head.next;
    for(int i=0; i<n; i++){
        printf("%s : %d\n", cur->name, cur->ticket);
        cur = cur->next;
    }
    printf("Invalid : %d", invaild);

    return 0;
}

发表于 2023-02-17 14:38:16 回复(0)
#include<stdio.h>
#include<string.h>
int main(){
    char a[100][20];        //最长名字20,最多候选人数100
    int b[100]={0};         //最多得票数100
    int n;
    int i,j,Invalid=0;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%s",&a[i]);  //n个候选人名字
    }

    int m;
    scanf("%d",&m);         //投票人的人数
    for(j=0;j<m;j++){
        char c[20];         //最长名字20
        scanf("%s",c);      //注意!!!gets(c)会出错
        for(i=0;i<n;i++){   //投票
            if(strcmp(c,a[i])==0){
                b[i]++;
                break;
            }
        }
        if(i==n&&strcmp(c,a[i])!=0)
            Invalid++;
    }
    for(i=0;i<n;i++){
        printf("%s : %d\n",a[i],b[i]);
    }
    printf("Invalid : %d",Invalid);
    return 0;
}

发表于 2022-07-24 05:04:48 回复(0)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    int n;
    char name[100][32] ={{'\0'}};
    int voter_num;
    char voter_name[100][32] ={{'\0'}};
    int i=0,j = 0,k=0;
    int map[101] ={0};
    int Invalid = 0;
    while(scanf("%d",&n)!=EOF)
    {
        
        for(i=0;i<n;i++)
        {
            scanf("%s",name[i]);
        }
        scanf("%d",&voter_num);
        for(i=0;i<voter_num;i++)
        {
            scanf("%s",voter_name[i]);
        }
        for(j = 0;j<voter_num;j++)
        {
           Invalid = 1;
           for(i = 0;i < n; i++ )
           {
              if(strcmp(name[i], voter_name[j])==0) 
              {
                  map[i]++;
                  Invalid = 0;
              }
           }
           if(Invalid == 1)
           {
               map[n]++;
           }
        }
        for(i = 0;i <=n; i++ )
        {
            if(i!=n)
            {
                printf("%s",name[i]);
            }
            else
            {
                printf("Invalid");
            }
            printf(" : ");
            printf("%d\n",map[i]);
        }
    }
    return 0;
}
发表于 2022-06-19 18:03:36 回复(0)
#include <stdio.h>
#include <string.h>
#define    N    100
int main()
{
    char str[N][N],temp[N];
    int peo,vote,i,j,arr[N]={0};
    scanf("%d",&peo);
    for(i=0;i<peo;i++)
    {
        scanf("%s",str[i]);
    }
    scanf("%d",&vote);
    for(i=0;i<vote;i++)
    {
        scanf("%s",temp);
        for(j=0;j<peo;j++)
        {
            if(!strcmp(str[j],temp))
            {
                arr[j]++;
                break;
            }
        }
        if(j==peo)
            arr[peo]++;
    }
    for(i=0;i<peo;i++)
    {
        printf("%s : %d\n",str[i],arr[i]);
    }
    printf("Invalid : %d\n",arr[peo]);
    return 0;
}

发表于 2022-04-26 10:17:46 回复(0)
#include<stdio.h>
#include<string.h>
typedef struct table
{
    char name[10];
    int count;
}name;

int main(){
    int candidate_number;

    while(scanf("%d",&candidate_number)!=EOF){
        name candidate[candidate_number];
        for(int i=0;i<candidate_number;i++){
            scanf("%s",candidate[i].name);
            candidate[i].count=0;
        }
        int vote_number;
        scanf("%d",&vote_number);
        name vote[vote_number];
        for(int i=0;i<vote_number;i++){
            scanf("%s",vote[i].name);
            vote[i].count=0;
        }
        int Invalid=vote_number;
        for(int i=0;i<candidate_number;i++){
            for(int j=0;j<vote_number;j++){
                if(strcmp(candidate[i].name,vote[j].name)==0){
                    candidate[i].count++;
                    Invalid--;
                }
            }
        }
        for(int i=0;i<candidate_number;i++){
            printf("%s : %d\n",candidate[i].name,candidate[i].count);
        }
        printf("Invalid : %d\n",Invalid);
    }
    return 0;
}

发表于 2022-01-22 23:31:59 回复(0)
c语言有没有好用的hash表标准库函数呀?

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct 
{
    char name[30];
    int cnt;
}ele;

ele arr[100] = {0};
int num = 0;

void add_ele(char* n)
{
    strcpy(arr[num++].name,n);
}

int add_cnt(char* name)
{
    int i;
    for(i=0;i<num;i++)
    {
        if(!strcmp(name,arr[i].name))
        {
            arr[i].cnt++;
            return 0;
        }
    }
    return 1;
}

void reset_all()
{
    num = 0;
    memset(arr,0,sizeof(arr));
}

void print_cnt(int e)
{
    int i;
    for(i=0;i<num;i++)
    {
        printf("%s : %d\n",arr[i].name,arr[i].cnt);
    }
    printf("Invalid : %d\n",e);
    reset_all();
    return;
}

int main()
{
    char name[30]={0};
    int n,i,e;
    reset_all();
    while(scanf("%d",&n)!=EOF)
    {
        e = 0;
        for(i=0;i<n;i++)
        {
            scanf("%s\n", name);
            add_ele(name);
        }
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            scanf("%s\n", name);
            e+=add_cnt(name);
        }
        print_cnt(e);
    }
}


发表于 2022-01-10 19:45:33 回复(1)
// hash
#include <stdio.h>

typedef struct {
    char *name;
    int count;
} Vote;

Vote g_vote[100];
int g_index;

int GetIndex(char *name) {
    for (int i = 0; i < sizeof(g_vote) / sizeof(Vote); i++) {
        if (g_vote[i].name != NULL && strcmp(name, g_vote[i].name) == 0) {
            return i;
        }
    }
    
    return -1;
}

int InsertVote(char *name)
{
    int i = GetIndex(name);
    if (i >= 0) {
        g_vote[i].count++;
        return 0;
    }
    
    return -1;
}

void InsertName(char *name)
{
    g_vote[g_index].name = name;
    g_vote[g_index].count = 0;
    g_index++;
}

int main(void)
{
    int n = 0;
    while (scanf("%d", &n) != EOF) {
        g_index = 0;
        memset(g_vote, 0, sizeof(g_vote));
        char name[50] = {'\0'};
        for (int i = 0; i < n; i++) {
            scanf("%s", name);
            char *tmp = (char *)malloc(sizeof(char) * (strlen(name) + 1));
            strncpy(tmp, name, strlen(name) + 1);
            InsertName(tmp);
        }
        int can = 0;
        int invalid = 0;
        scanf("%d", &can);
        for (int i = 0; i < can; i++) {
            scanf("%s", name);
            if (InsertVote(name) != 0) {
                invalid++;
            }
        }
        
        for (int i = 0; i < g_index; i++) {
            printf("%s : %d\n", g_vote[i].name, g_vote[i].count);
        }
        printf("Invalid : %d\n", invalid);
    }
}

发表于 2021-09-20 21:48:19 回复(0)
#include "stdio.h"
#include "string.h"

int main()
{
    int n,N,k;
    char str1[1000] = {0};
    int MatchFlag = 0;
    while(scanf("%d", &n) != EOF)
    {
        char str_temp[100] = {0};
        char str2[100] = {0};
        int vote[100] = {0};
        int object = 0;
        int Invalid = 0;
        getchar();
        memset(str1,0,sizeof(str1));
        scanf("%[^\n]", str1);//只有%s才会自动在末尾加入终止符\0,故这里没有终止符,会被上一次脏数据影响。
        scanf("%d", &N);
        //getchar();
        for(int i=0; i<N; i++)
        {
            scanf("%s", str2);
            object = 0;
            MatchFlag = 0;
            for(int j=0; str1[j] != '\0'; j++)
            {
                k=0;
                memset(str_temp,0,sizeof(str_temp));
                while(str1[j] != ' ' && str1[j] != '\0')
                {
                    str_temp[k] = str1[j];
                    k++, j++;
                }
                if(strcmp(str_temp,str2) == 0)
                {
                    vote[object]++;
                    MatchFlag = 1;
                    break;
                }
                else
                    object++;
            }
            if(!MatchFlag)
                Invalid++;
        }
        object = 0;
        for(int j=0; str1[j] != '\0'; j++)
        {
            k=0;
            memset(str_temp,0,sizeof(str_temp));
            while(str1[j] != ' ' && str1[j] != '\0')
            {
                str_temp[k] = str1[j];
                k++, j++;
            }
            printf("%s : %d\r\n", str_temp, vote[object]);
            object++;
        }
        printf("Invalid : %d\r\n", Invalid);
        
    }
    return 0;
}

发表于 2021-09-14 16:14:39 回复(0)
为什么变量声明放到While外面就没用了呢,提交就不通过?

#include <stdio.h>
//#include <malloc.h>
//#include <string.h>
#include <stdlib.h>

//#define MAX_LEN 20

int main(void){
    int n = 0;//候选人数
    
    while(scanf("%d",&n)!=EOF){
        //scanf("%d",&n)!=EOF;//输入候选人数;
        char names[100][20] ;
        char name[20] = {'0'};
        //char EmptyName[MAX_LEN] = {'\0'};
        int votes[100] = {0};
        int invalidCount = 0 ;
        int total = 0;
        for(int i = 0; i < n; i++){
            scanf("%s",names[i]);
        }//输入候选人名;
        
        scanf("%d",&total);
        
        for(int i = 0; i < total;i++){
            //strcpy(name,EmptyName);
            memset(name,0,20);
            scanf("%s",name);
            for(int j=0;j<n;j++){
                if(0==strcmp(name,names[j])){
                    votes[j]++;
                    break;
                }
                if(j==n-1){
                    invalidCount ++;
                    //printf("i = %d,j= %d,invalid = %d\n",i,j,invalidCount);
                }
               
            }
        }
        for(int i=0;i<n;i++){
            printf("%s : %d\n",names[i],votes[i]);
        }
        printf("Invalid : %d\n",invalidCount);
    }
    return 0;
}


发表于 2021-08-19 14:21:05 回复(0)