出行计划
要在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;
}