首页 > 编程语言 >ccf-csp-2020-12-2期末预测之最佳阈值(c++满分题解)

ccf-csp-2020-12-2期末预测之最佳阈值(c++满分题解)

时间:2024-03-26 14:58:25浏览次数:21  
标签:12 int 题解 c++ num vec ans include set1

这个题暴力是可以有70分的,下面是暴力代码:(注释写的比较清楚了,也很好理解)

#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
bool sort1(pair<int,int> vec1,pair<int,int> vec2)//对阈值从小到大排序
{
	return vec1.first<=vec2.first;
}
int main()
{
	int n;
	cin>>n;
	vector<pair<int,int>> vec;
	set<int> set1;
	for(int i=0;i<n;++i)
	{
		int a,b;
		cin>>a>>b;
		vec.push_back(make_pair(a,b));
		set1.insert(a);//set去重记录有哪些阈值
	}
	sort(vec.begin(),vec.end(),sort1);
	int ans=0;//记录最大预测正确次数
	int res=0;//记录最大预测正确次数的阈值
	for(auto it=set1.begin();it!=set1.end();it++)//从所有的阈值开始遍历
	{
		int num=0;
		int temp=*it;
		for(int i=0;i<n;++i)//遍历所有情况,得出每个阈值的正确次数
		{
			if((vec[i].first<temp && vec[i].second==0) || (vec[i].first>=temp && vec[i].second==1))
				num++;
		}
		if(num>=ans)
		{
			ans=max(ans,num);//得到最大值
			res=temp;
		} 

	}
	cout<<res<<endl;
		
} 

接下来是100分题解,

我先说一下我自己的思路,我是看到这个样例1的详细解释我才想到这个

去重记录所有阈值,0 1 3 5 7

然后对0计算正确次数,会发现是11,31,51,71 这四个样本,

如果我们对1计算正确次数,发现是0 0,11,31,51,71这五个样本,很容易发现有重复的样本,如果暴力计算,这些就是超时的根源,并且他们是有规律的,1与0相比多的0 0,为了使规律更加明显,我们看一下对下面几个样本计算正确次数

3: 0 0, 1 0 ,3 1 ,51, 71

5:0 0,1 0,5 1,7 1

现在规律 就很明显了,加入说0的正确次数是num,那么对1求正确次数的时候只需要看0的样本,有0 0样本的话,num++(因为对1来说是正确的样本),有0 1样本的话,num--(对1来说是不正确的样本);如果对2求正确次数,同理,只要看1 0(num++)的个数与11(num--)的个数。。。。对所有阈值进行计算,得出正确次数,这样的话遍历的次数就少了很多,相当于总共遍历了两次所有样本(一次是求0的num值,第二次是求剩下的所有num值)

下面是代码:

#include<iostream>
#include<set>
#include<vector>
#include<algorithm> 
using namespace std;
bool sort1(pair<int,int> vec1,pair<int,int> vec2)
{
	return vec1.first<=vec2.first;
}
int main()
{
	int n;
	cin>>n;
	vector<pair<int,int>> vec;
	set<int> set1;
	for(int i=0;i<n;++i)
	{
		int a,b;
		cin>>a>>b;
		vec.push_back(make_pair(a,b));
		set1.insert(a);
	}
	sort(vec.begin(),vec.end(),sort1);//记得排序
	auto it=set1.begin();
	int temp=*it;
	int sum=0;
	for(int i=0;i<n;++i)//对第一个元素求num值
	{
		if((vec[i].first<temp && vec[i].second==0) || (vec[i].first>=temp && vec[i].second==1))
			sum++;
	}
	int ans=sum;
	int res=temp;//res是最后的结果
	it++;
	int index=0;
	for(;it!=set1.end();it++)//对剩下的阈值开始计算正确次数num
	{
		for(int i=index;i<n;++i)
		{
			if(vec[i].first!=temp)//0 1 3 5 7//
				break;
			if(vec[i].first==temp && vec[i].second==1)//对于1来说只需要计算0 0, 01 的个数,对于3来说只需要计算1 0, 1 1的个数
				sum--;
			else if(vec[i].first==temp && vec[i].second==0)
				sum++;
			index++;
		}
		if(sum>=ans)
		{
			ans=max(sum,ans);//求最值
			res=*it; 
		}
		temp=*it;
	}
	cout<<res<<endl;
}

下面是提交记录截图:

写的有点着急,如有错误,感谢指出,希望和大家一起共同进步

标签:12,int,题解,c++,num,vec,ans,include,set1
From: https://blog.csdn.net/qq_62942992/article/details/137045664

相关文章

  • 125.验证回文串
    回顾用的,原题链接:.-力扣(LeetCode)如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。字母和数字都属于字母数字字符。给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。......
  • CUTLASS: Fast Linear Algebra in CUDA C++
    https://developer.nvidia.com/blog/cutlass-linear-algebra-cuda/EfficientMatrixMultiplicationonGPUs计算密集度=(时间复杂度/空间复杂度)=O(N^3)/O(N^2)=O(N)//naivefor(inti=0;i<M;++i)for(intj=0;j<N;++j)for(intk=0;k<......
  • c++栈内存溢出问题
    问题说明实验课测量快排时间时,用intar[MAXSIZE+1];来创建数组,数据规模从1000-10000,而MAXSIZE的设置不能超过600000,超过了程序就无法运行直接中断,理论上这是不应该。程序中用rand()生成随机数据,但若对数据求模rand()%100,则程序运行到中途会异常中断。问题原因intar[M......
  • 【C++】常用序列式容器迭代器自增效率实测
    常用序列式容器包括vector、list、deque。本篇文章就来评析它们的迭代器,不同自增方式效率的不同。在看这篇文章之前,大家可以先看看这篇文章:【C++】自增运算符重载及其效率问题-CSDN博客,了解一下之前得出的结果。前面的文章其中一个结论是,在自定义类型的自增(自减)运算符重载......
  • C++面向对象整理(9)之类型转换 dynamic_cast、static_cast、const_cast及其安全性
    C++面向对象整理(9)之C++的类型转换dynamic_cast、static_cast、const_cast注:整理一些突然学到的C++知识,随时mark一下例如:忘记的关键字用法,新关键字,新数据结构C++的类型转换C++面向对象整理(9)之C++的类型转换dynamic_cast、static_cast、const_cast一、C++的类型转换......
  • 函数是什么?C++函数详解!
    1、函数的声明和定义在复杂的程序中,如果全部的代码都写在main函数中,main函数体将非常庞大臃肿。把任务分工到其它的函数中,main函数只负责程序的核心流程,具体的任务由其它函数完成。这种思想就是模块化编程。声明和定义函数的语法:返回值的数据类型函数名(参数一的数据类型......
  • [题解] BZOJ4203 同桌的你
    题意给出\(n\)个人的性别\(b_i\)、喜欢的人\(a_i\)(有且仅有一个)。现在两人分一组,若一组中存在一人喜欢另一人,则称这一组为「满意」的。要求在最大化「满意」组数的前提下最大化男女同桌组数,并构造分组方案。思路考虑建图,从\(i\)到\(a_i\)连一条有向边,转化为基环树上......
  • C++ 23 新特性概览之 标准库
    文章目录C++23新特性概览之标准库简介关于环境字符串格式化改进标准库模块`importstd``importstd.compat``basic_string(_view)::contains()`禁止从`nullptr`构造`string(_view)``basic_string::resize_and_overwrite(count,op)``std::optional`的链式调用`S......
  • C++11标准模板(STL) 算法(std::reverse)
    定义于头文件<algorithm>算法库提供大量用途的函数(例如查找、排序、计数、操作),它们在元素范围上操作。注意范围定义为 [first,last) ,其中 last 指代要查询或修改的最后元素的后一个元素。逆转范围中的元素顺序std::reverse1)反转[first,last)范围中的元素顺序表......
  • C++ std::reverse函数
    函数原型,定义std::reverse定义于头文件 <algorithm>1(1)2template<classBidirIt>3voidreverse(BidirItfirst,BidirItlast);(C++20前)45template<classBidirIt>6constexprvoidreverse(BidirItfirst,BidirItlast);(C++20起)......