【CSP CCF记录】202203-2 出行计划

题目

 

过程

第一次提交

暴力求解,时间复杂度为n*n,超时

#include<bits/stdc++.h>
using namespace std;
const int N=100001;
int n,m,k;
int t[N],c[N],q[N];
int main()
{
	cin>>n>>m>>k;
	
	for(int i=0;i<n;i++)
	{
		cin>>t[i]>>c[i];
	}
	for(int i=0;i<m;i++)
	{
		int q=0;
		cin>>q;
		int sum=0;
		for(int i=0;i<n;i++)
	    {
		    if((q+k<=t[i])&&(q+k+c[i]>t[i]))
		    {
			   sum++;
			  //cout<<"满足"<<i<<endl;		
		    }
    	}
    	cout<<sum<<endl;
	}	
	return 0;
}

第二次提交

由题意知若正常出行,出行时刻需满足:

q+k\leq t<q+k+c

对不等式进行变换可得

t-c<q+k\leq t

t-c+1\leq q+k\leq t

含义为在[t-c+1,t]时间区间内拿到核酸结果才可正常出行。

同时,像t=5,c=24这样的情况,最早也只能在0时刻取得核酸结果,因此时间区间的开始时刻改为start=max(t-c+1,0)

使用一个数组a[N]记录,哪些时刻拿到核酸结果可以正常出行。如第5条出行计划,t=35,c=24,在[12,35]之间拿到核酸结果则可以正常出行,则a[12]=1,a[13]=1...a[35]=1。

输入查询q,代表q时刻做核算,得到核酸的时间为q+k,只需读取a[q+k]即可得知在这个时刻拿到核酸结果可以满足几条出行计划。

参考:http://t.csdnimg.cn/karIY

PS:

一开始设置a[100001],运行超时,后来按照参考代码就正确了,没想明白,,,,

#include<iostream>
using namespace std;

int n, m, k, t, c, q;
int a[300002] = { 0 };
int main()
{
	cin >> n >> m >> k;
	for(int i = 0; i < n; i++)
	{
		cin >> t >> c;
		for (int j = max(0, t - c + 1); j <= t;j++)
		{
			a[j]++;
		}
	}
	for (int i = 0; i< m; i++)
	{
		cin >> q;
		cout << a[q + k]<< endl;
	}
	return 0;
}

结果

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值