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

 想查看其他题的真题及题解的同学可以前往查看: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∼4 10000 2000 2000
5∼7 109 2000 2000
8∼9 2×105 1 105
10∼11 2×105 105 105 r−l≤10,只有事件 1, 4, 5
12∼14 2×105 105 105 r−l≤10
15∼17 2×105 105 105
18∼20 109 105 105

对于所有的数据,满足 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()

运行结果: 


满分题解:


你可能感兴趣的:(算法题练习,python,开发语言,1024程序员节)