题目描述
输入
第一行,两个整数:a和n。2<=a<=10^9, 1<=n<=50。
第二行,n个整数,第i个整数是p[i],0<=p[i]<=10^9。
输出
一个整数k。
样例输入 复制
10 3
5 6 3
样例输出 复制
7
程序
#include<bits/stdc++.h>
using namespace std;
int find(int a, const vector<int> &num)
{
map<long long, int> freq;
for (int i =0; i < num.size(); i++) {
int n = num[i];
freq[n]++;
int k = n;
while (freq[k] == a) {
freq.erase(k);
k++;
freq[k]++;
}
}
if (freq.size() == 1 && freq.begin()->second == 1) {
return freq.begin()->first;
}
return freq.rbegin()->first + 1;
}
小知识:freq.begin()-
TF-IDF(term frequency–inverse document frequency)
这是一种用于信息检索的一种常用加权技术。它是一种统计方法,用以评估一个字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
假如一篇文件的总词语数是100个,而词语“母牛”出现了3次,那么“母牛”一词在该文件中的词频就是 0.03 (3/100)。一个计算文件频率 (DF) 的方法是测定有多少份文件出现过“母牛”一词,然后除以文件集里包含的文件总数。所以,如果“母牛”一词在1,000份文件出现过,而文件总数是 10,000,000份的话,其文件频率就是 0.0001 (1000/10,000,000)。最后,TF-IDF分数就可以由计算词频除以文件频率而得到。以上面的例子来说,“母牛”一词在该文件集的TF- IDF分数会是 300 (0.03/0.0001)。这条公式的另一个形式是将文件频率取对数。
具体的计算原理,请参考维基百科 tf–idf条目。下面简单介绍下基本的计算步骤:
1,文档预处理:1)文档分词;2)移除停用词;3)单词正规化处理
2,分出的单词就作为索引项(或单词表),它们代表的就是向量空间的项向量
3,计算项权值:这包括要计算1)词频 ; 2)倒排文件频率;3)TF-IDF权值
4,计算文档之间的相似度,一般用余弦相似度(cosine similarity)一同使用于向量空间模型中,用以判断两份文件之间的相似性
#include "ITokeniser.h"
#include <map>
class TFIDFMeasure
{
private:
StrVec _docs;//文档集合,每一行字符串代表一份文档
int _numDocs;//文档数目
int _numTerms;//单词数目
StrVec _terms;//单词集合
Int2DVec _termFreq;//每个单词出现在每份文档中的频率
Double2DVec _termWeight;//每个单词在每份文档的权重
IntVec _maxTermFreq;//记录每一份文档的最大词频
IntVec _docFreq;//出现单词的文档频率
ITokeniser* _tokenizer;//分词器
map<string,int> _wordsIndex;//单词映射表,保存每一个单词及其对应的下标
public:
TFIDFMeasure(const StrVec& documents,ITokeniser* tokeniser);
public:
~TFIDFMeasure(void);
protected:
void Init();//初始化TF-IDF计算器
void GenerateTerms(const StrVec& docs,StrVec& terms);//分词处理
void GenerateTermFrequency();//计算词频
void GenerateTermWeight();//计算词的权重
void GetWordFrequency(string& input,map<string,int>& freq); //实际统计词频函数
int CountWords(string& word, const StrVec& words);//统计词数
int GetTermIndex(const string& term);//查询词语对应的下标
double ComputeTermWeight(int term, int doc);//计算词语在指定文档中的权重值
double GetTermFrequency(int term, int doc);//获取词语在指定文档的词频
double GetInverseDocumentFrequency(int term);//计算倒排文件频率
public:<