不是写过吗?跟下面的题目基本一样,就是多加了个类而已
https://ask.csdn.net/questions/7927657
都是容器的基本用法
第一个对应算法(100%正确):
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <map>
using namespace std;
int N,D,K,ans;
//存储日志
struct log{
int id,time;
};
//对id进行升序排序
bool cmp(log a,log b)
{
return a.time < b.time;
}
int main()
{
//快读配置
std::ios::sync_with_stdio(0);
//读取规模
cin>>N>>D>>K;
//存储多个日志并排序
vector<log> logs(N);
for(int i = 0;i<N;++i)
{
cin>>logs[i].time>>logs[i].id;
}
sort(logs.begin(),logs.end(),cmp);
//记录答案
set<int> ans;
//记录id出现的次数
map<int,int>cnt;
int j = 0;//哨兵
for(int i = 0;i<N;++i)
{
while(j<N&&logs[j].time-logs[i].time<D)
{
cnt[logs[j].id]++;
if(cnt[logs[j].id]>=K)ans.insert(logs[j].id);
j++;
}
cnt[logs[i].id]--;
}
for(set<int>::iterator i = ans.begin();i !=ans.end();i++)cout<<*i<<endl;
return 0;
}
第二个对应算法(67%正确):
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
int N,D,K,ans;
//存储日志
struct log{
int id,time;
};
//对id进行升序排序
bool cmp(log a,log b)
{
return a.id < b.id;
}
int main()
{
//快读配置
std::ios::sync_with_stdio(0);
//读取规模
cin>>N>>D>>K;
//存储多个日志并排序
vector<log> logs(N);
for(int i = 0;i<N;i++)
{
cin>>logs[i].time>>logs[i].id;
}
sort(logs.begin(),logs.end(),cmp);
set<int> ans;
int cid,j = 0,end = 0;//当前查找的id,索引j
while(j<N)//从头开始查找
{
cid = logs[j].id;
//查找一组id对应的开始结束日期
int start = j,end = start,ck = 1;
while(cid==logs[end].id)end++;
//记录在某时间段中获得赞大于等于K的id
for(int si = start;si<end-1;si++)
{
for(int ji = si+1;ji<end;ji++)
{
if(abs(logs[si].time-logs[ji].time) < D) ck++;
}
if(ck>=K)
{
ans.insert(logs[si].id);
break;
}
ck = 0;
}
j = end;
}
for(set<int>::iterator i = ans.begin();i !=ans.end();i++)cout<<*i<<endl;
return 0;
}
对于较长的题目,我们可以使用map和vector混合实现,通过map来实现快速的元素查找和插入,而使用vector来存储相同键值的元素,从而提高程序的效率和效果。
具体实现方法如下:
std::map<int, std::vector<int>> myMap;
int key = 1;
int value = 10;
if(myMap.find(key) == myMap.end()) {
std::vector<int> tmp;
tmp.push_back(value);
myMap[key] = tmp;
} else {
myMap[key].push_back(value);
}
int key = 1;
int value = 10;
if(myMap.find(key) != myMap.end()) {
std::vector<int> tmp = myMap[key];
for(int i=0;i<tmp.size();i++) {
if(tmp[i] == value) {
// 找到了对应的元素
break;
}
}
} else {
// 该元素不存在
}
通过使用map和vector混合实现,可以在快速查找元素的同时,避免了map排序带来的额外开销,提高了程序效率和效果。