CCF-CSP真题《202209-4—吉祥物投票》思路+python题解

该博客讨论了一道编程竞赛题目,涉及吉祥物投票的模拟。题目要求处理不同类型的事件,如作品拉票、作品退出、作品交换等,并根据投票意愿进行调查。博主分享了初始的20分解决方案,但因内存超限未能通过,然后给出了一个优化后的满分解决方案,该方案能够有效处理大规模数据并得出正确结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 想查看其他题的真题及题解的同学可以前往查看:CCF-CSP真题附题解大全

试题编号:202209-4
试题名称:吉祥物投票
时间限制:1.0s
内存限制:1.0GB
问题描述:

题目描述

为了促进西西艾弗岛上的旅游业发展,当地决定设计一个吉祥物形象。活动吸引了众多设计领域的大师和爱好者参加,经过初步筛选,共选出了 m 个作品,编号为 1∼m,进行最终的投票角逐。

活动还吸引了西西艾弗岛上的 n 名投票者参与,编号为 1∼n,每人都在最终的投票环节拥有投一票的权利,也可以放弃投票。我们定义每个人的投票意愿 ai(1≤i≤n) 为一个 0∼m 的整数,若 ai=0 表示这个人目前没有支持的作品,打算放弃投票,否则表示这个人支持第 ai 号作品并有意愿将票投给它。

最初,由于所有人对参与竞选的作品都不了解,因此投票意愿 ai 均为 0。接下来是紧张刺激的拉票环节,作品的设计者们要想方设法给自己的作品拉票,这一过程中可能出现如下若干种事件:

1 l r x:编号为 x 的作品开展了一场拉票活动,成功地吸引了编号为 l∼r 的投票者的兴趣,使得他们的投票意愿全部改为 x。

2 x w:编号为 x 的作品需要经历一次大规模修改,所以需要暂时退出竞选。由于 x 与 w 两个作品的风格较为相近,因此原先投票意愿为 x 的投票者的投票意愿变为了 w。特别地,若 w=0,表示这些投票者暂时找不到新的支持的作品。需要注意的是,作品 x 退出竞选只是暂时的,因此后续的事件中作品 x 仍可能出现。

3 x y:主办方发现自己的统计出现了失误,将编号为 x 和 y 的作品弄颠倒了。发布勘误后,所有原先投票意愿为 x 的投票者的投票意愿变为了 y,所有原先投票意愿为 y 的投票者的投票意愿变为了 x。

4 w:主办方决定进行一次调查:希望知道所有投票者中,当前投票意愿为 w 的有多少人。若 w≠0 ,相当于调查有多少投票者目前支持作品 w ,否则相当于调查有多少投票者目前没有支持的作品。

5:主办方决定进行一次调查:若以现在的投票意愿进行最终的投票,获胜的作品是哪一个。规定得票数至少为 1 且最多的作品获胜,得票数相同则编号较小的作品获胜。特别地,若所有作品均无得票,认为不存在获胜作品。

从拉票开始到结束,共出现了 q 次如上的事件。由于参选的作品数和投票人数实在太多,单凭活动主办方的能力难以全面统计,现在请你编写一个程序来处理这些事件,并求出每次调查的结果。

输入格式

从标准输入读入数据。

第 1 行,3 个正整数 n,m,q。

接下来 q 行,每行 1∼4 个非负整数,描述一个事件。

输出格式

输出到标准输出。

对于每个 4 或 5 事件输出一行,一个非负整数表示此次调查的结果。其中事件 5 若不存在获胜作品则输出0

样例输入

10 2 15
5
1 2 4 1
1 4 7 2
4 1
5
1 3 4 1
5
1 7 9 1
3 1 2
4 2
2 1 2
4 2
2 2 0
4 2
5

样例输出

0
2
2
1
6
8
0
0

评测用例规模与约定

测试点编号n≤m≤q≤特殊性质
1∼41000020002000
5∼710920002000
8∼92×1051105
10∼112×105105105r−l≤10,只有事件 1, 4, 5
12∼142×105105105r−l≤10
15∼172×105105105
18∼20109105105

对于所有的数据,满足 1≤n≤109,1≤m,q≤105,1≤l≤r≤n,1≤x,y≤m,0≤w≤m。保证事件 2 中 x≠w,事件 3 中 x≠y。

真题来源:吉祥物投票

解题思路:

        看了一眼感觉很容易理解,也就按照每个动作直白写了操作,最后果不其然内存超了,拿了20分

20分题解(内存超限) :

n, m, q = map(int,input().split())
people = [0 for i in range(n)]

def pull(ticket):
    l = ticket[1]
    r = ticket[2]
    x = ticket[3]
    for i in range(l,r+1):
        people[i] = x

def alter(ticket):
    x = ticket[1]
    w = ticket[2]
    for i in range(n):
        if people[i]==x:
            people[i] = w

def exchange(ticket):
    x = ticket[1]
    y = ticket[2]
    for i in range(n):
        if people[i]==x:
            people[i] = y
        elif people[i]==y:
            people[i] = x

def survey(ticket):
    w = ticket[1]
    if w != 0:
        print(people.count(w))
    else:
        print(people.count(0))

def final():
    if sum(people)==0:
        print(0)
    else:
        temp = [0]*(m+1)
        for i in range(n):
            temp[people[i]] += 1
        print(temp[1:].index(max(temp[1:]))+1)

for j in range(q):
    ticket = [i for i in map(int,input().split())]
    if ticket[0]==1:
        pull(ticket)
    elif ticket[0]==2:
        alter(ticket)
    elif ticket[0]==3:
        exchange(ticket)
    elif ticket[0]==4:
        survey(ticket)
    elif ticket[0]==5:
        final()

运行结果: 


满分题解:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hulake_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值