列表

详情


NC217473. 作弊

描述

溪染:六王毕四海蜀山兀,阿房出。覆压三百余里隔离天日骊山北构而西折,直走咸阳。二川溶溶流入宫墙。五步一楼,十步一阁;廊腰缦回檐牙高啄各抱地势钩心斗角......
叁秋:还在背《阿房宫赋》啊。
溪染:(停下背书)明天就要测试了,难道不背?
叁秋:什么?明天要测试?我现在抱佛脚还来得及嘛?
溪染:也就十来篇文言文而已。哦,你比较笨,那估计来不及了
叁秋:(沉默几秒)救救孩子吧!
溪染:我想想办法,我把文言文先换成拼音,然后在考场用动作语言传给你怎么样?
叁秋:什么动作语言?
溪染:我们先规定一个规则好了,我用‘点头’和‘摇头’向你传递信息。
叁秋:然后呢?
溪染:比如用‘点头-摇头’代表,用'点头-点头'代表
叁秋:我知道了!就用'点头-点头-点头'表示
溪染:没救了,你是真的傻!如果这样,那我'点头-点头-点头-点头-点头-点头'表示什么?
叁秋:可以,也行!!
溪染:对的,这样的规则就有歧义了,所以我们定义的任意2个规则,一个规则都不能是另一个的前缀,更不能相同!
叁秋:那这还不简单!我用'点头-摇头'表示,用'点头-点头-摇头'表示,用'点头-点头-点头-摇头'表示,以此类推!
溪染:用你这个规则,我脖子可能就不在了!
溪染:我们应该找到一个规则,让我‘点头’and‘摇头’的次数和最少,这样的话即可以快速传递信息,被监考老师发现的几率也小一些。
叁秋:那我们改怎么规定规则呢?
溪染:现在我们把文言文转为拼音先
(过了一会儿)
溪染:我们已经知道到时候我该给你传递的信息了,我们稍加计算一下,就可以找到最好的规则了
叁秋:那怎么计算呢?
溪染:我都为你付出这么多了,怎么找到最好的规则就靠你自己了
(又过了一会儿)
叁秋实在不知道怎么计算,于是找到了你

输入描述

一行字符串,表示需要传达的信息,有可能是文言文拼音,中仅包含小写英文字母。

输出描述

仅一行一个正整数表示问题的答案,表示传达信息所需最少的‘点头’and‘摇头’的次数之和。

示例1

输入:

aaaaaa

输出:

6

说明:

‘a’用'点头'代表即可

示例2

输入:

abcabc

输出:

10

说明:

‘a’用'点头'代表
‘b’用‘摇头-点头’代表
‘c’用‘摇头-摇头’代表

示例3

输入:

havefuninthegame

输出:

54

说明:

解释那么长,这点地方够吗?

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 141ms, 内存消耗: 8212K, 提交时间: 2021-07-15 17:50:07

#include<bits/stdc++.h>
using namespace std;
int main(){
	string s;
	cin>>s;
	vector<int>a(26,0);
	for(char t:s)a[t-'a']++;
	priority_queue<int,vector<int>,greater<int> >q;
	for(auto t:a)if(t)q.push(t);
	int ans=0;
	while(q.size()>1){
		int a=q.top();
		q.pop();
		int b=q.top();
		q.pop();
		ans+=a+b;
		q.push(a+b);
	}
	cout<<ans;
}

pypy3 解法, 执行用时: 767ms, 内存消耗: 43700K, 提交时间: 2021-06-19 11:06:22

import heapq
from typing import Counter

str = input()

dic = list(Counter(str).values())
heap = heapq.heapify(dic)
res = 0
while len(dic)>=2:
    a = heapq.heappop(dic)
    b = heapq.heappop(dic)
    res += a + b
    heapq.heappush(dic, a + b)
print(dic[0] if not res else res)

Python3 解法, 执行用时: 347ms, 内存消耗: 13860K, 提交时间: 2021-06-19 11:11:12

import heapq
from typing import Counter

str = input()
dic = list(Counter(str).values())
heap = heapq.heapify(dic)
res = 0
while len(dic)>=2:
    a = heapq.heappop(dic)
    b = heapq.heappop(dic)
    res += a + b
    heapq.heappush(dic, a + b)
print(dic[0] if not res else res)

上一题