csp认证真题

出行计划

要在t时刻进入场所,获得核酸检测结果的时间点(t+k应该在[t-c+1,t]内(上段文字中c值为24),核酸检测结果才能生效。由于获得核酸检测结果的时刻>=1(因为等待核酸检测结果的时间k>0,所以获得核酸检测结果的时刻总是>=1),因此上述区间可以改为 [max(1,t-c+1),t]。且针对n个出行计划的输入,都能对应一个上述区间。如下:

5 24—>[1,5]
10 24—>[1,10]
11 24—>[1,11]
34 24—>[11,34]
35 24—>[12,35]
35 48—>[1,35]
在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;
const int maxn=4e+6;
int n,m,k;
int s[maxn],b[maxn];
int main(){
	cin>>n>>m>>k;
	
	for(int i=1;i<=n;i++){
		int t,c;
		cin>>t>>c;
		int left=t-c+1;
		left=left>0?left:1;
		int right=t;
		b[left]++;
		b[right+1]--;  //b数组初始时为0,对b数组做n次 特定区间加1的操作
		//所以验证包含输入值q的区间个数==b[1]+...+b[q],即b的前q项和。 
	}
	for(int i=1;i<=maxn;i++){
		b[i]=b[i-1]+b[i];
	}
	 while(m--)
    {
        int x;
        cin>>x;
        cout<<b[x+k]<<endl;//直接得到x+k处的数值
    }
    return 0;
}

期末预测之最佳阈值

(一组二维数字,按照第一列数字升序排列)

6
0 0
1 0
1 1
3 1
5 1
7 1
加入选定一个标准为3,则统计第一列小于3,第二列是0, 第二列大于等于3,第二列是1 的和

在这里插入图片描述
结果返回阈=标准值3;

知识点前缀和+结构体运用;

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+12;
int n;
struct point{
	int x,y;
	int temp;
	int head0,tail1;
}node[maxn];
//struct point 一定在bool comp上面
 
bool comp(point a,point b){
	return a.x<b.x;
}
//结构体升序排列; 

int main(){
	cin>>n;
  int max=0,ans;
  node[0].head0=0;
  node[n+1].tail1=0;
	for(int i=1;i<=n;i++){
		cin>>node[i].x>>node[i].y;
	//	node[i].temp=0;
		node[i].head0=0;
		node[i].tail1=0;
	}
	sort(node+1,node+1+n,comp);
	for(int i=1;i<=n;i++){
		//统计升序之后的序列 某阈值前0的个数,并用结构体的一个变量head0记录; 
		if(node[i].y==0)
		node[i].head0=node[i-1].head0+1;
		else
		node[i].head0=node[i-1].head0;
	}
		for(int i=n;i>=1;i--){
		统计升序之后的序列 某阈值后1的个数,并用结构体的一个变量tail1记录; 
		if(node[i].y==1)
		node[i].tail1=node[i+1].tail1+1;
		else
		node[i].tail1=node[i+1].tail1;
	}
	  for(int i=1;i<=n;i++){
	  	if(node[i].x==node[i-1].x)
	  	continue;
	  	if(max<=node[i-1].head0+node[i].tail1)
	  	//寻找 某个值 头0和尾1个数和 的最大值 并返回改值; 
	  	{
	  		max=node[i-1].head0+node[i].tail1;
	  	ans=node[i].x;
	  	}	  	
	  }
cout<<ans;
return 0; 
}

称检测点查询

主要知识点 sort 函数 考虑两个变量来升序排列
bool comp(point a,point b){
if(a.juli!=b.juli) return a.juli<b.juli;
if(a.num!=b.num) return a.num<b.num;
//首先按照juli从小到大排序,juli相同时 按照num从小到达排序;
//即首要考虑juli 再考虑num
}

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+12;
struct point{
	int num;
	int x,y;
	int juli;
}node[maxn];
 
bool comp(point a,point b){
if(a.juli!=b.juli)	return a.juli<b.juli;
if(a.num!=b.num)	return a.num<b.num;
//首先按照juli从小到大排序,juli相同时 按照num从小到达排序; 
//即首要考虑juli 再考虑num 
}
//结构体升序排列;
int  isin(int a,int b,int a1,int b1){
  return (b1-b)*(b1-b)+(a1-a)*(a1-a);
} 
int main(){
int n,x0,y0;
	cin>>n>>x0>>y0;
 int min=1<<31;
  	for(int i=1;i<=n;i++){
  		node[i].num=i;
		cin>>node[i].x>>node[i].y;
     node[i].juli=isin(x0,y0,node[i].x,node[i].y);
      }//for
   sort(node+1,node+1+n,comp);
for(int i=1;i<=3;i++)
cout<<node[i].num<<endl;
return 0; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值