关于#c++#的问题:和map,vector混合使用

img

img

img


这是题目,题目比较长,主要是STL的应用,和map,vector混合使用

不是写过吗?跟下面的题目基本一样,就是多加了个类而已
https://ask.csdn.net/questions/7927657
都是容器的基本用法

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7570199
  • 你也可以参考下这篇文章:C++ vector与map的混合运用
  • 除此之外, 这篇博客: 日志统计 巧用Vector,map 【蓝桥杯真题】(c++实现)中的 算法展示 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 第一个对应算法(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;
    }
    

    下文链接:凑算式 全排列 【蓝桥杯真题】(c++实现)

  • 以下回答由chatgpt基于相关博客总结生成:

    对于较长的题目,我们可以使用map和vector混合实现,通过map来实现快速的元素查找和插入,而使用vector来存储相同键值的元素,从而提高程序的效率和效果。

    具体实现方法如下:

    1. 定义一个map对象,键为需要存储的元素的键值,值为vector类型,用于存储相同键值的元素。
    std::map<int, std::vector<int>> myMap;
    
    1. 对于需要插入的元素,先到map中查找对应的键值是否存在,如果不存在,则创建一个新的vector,并将元素插入到vector中,然后将vector插入到map中;如果存在,则在对应的vector中插入元素即可。
    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);
    }
    
    1. 对于需要查询的元素,先在map中查找是否存在对应的键值,如果存在,则在对应的vector中查找元素;如果不存在,则说明该元素不存在。
    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排序带来的额外开销,提高了程序效率和效果。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632