A
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 0x3f3f3f
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
ll x,v,l,r;
cin>>x>>v>>l>>r;
ll t1=x/v;
ll t2=(l-1)/v;
ll t3=r/v;
cout<<t1-(t3-t2)<<endl;
}
return 0;
}
B
题意 房间为一条直线长度为n 如果pos位置有加热器并且打开则能加热[pos - r + 1, pos + r - 1]区域 告诉你哪些位置有加热器0无1有 问最少开启多少加热器能把整个房间加热 贪心
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<deque>
#define ll long long
#define N 0x3f3f3f
using namespace std;
int a[1010];
int main()
{
int n,r;
int ans=0;
cin>>n>>r;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
int t=1;
while(t<=n)
{
int pos=-1;
for(int i=1;i<=n;i++)
{
if(a[i])
{
if(i-r+1<=t&&i+r-1>=t)
{
pos=i;
}
}
}
if(pos==-1)
{
cout<<"-1"<<endl;
return 0;
}
//cout<<pos<<endl;
ans++;
t=pos+r-1+1;
}
cout<<ans<<endl;
}
C
思路:模拟,记录并维护每个元素的位置和整个序列最左边的空位位置及最右边的空位位置即可。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<deque>
#define ll long long
#define N 0x3f3f3f
using namespace std;
int a[200010];
int main()
{
int l=1,r=2;
int q;
cin>>q;
while(q--)
{
char c;
cin>>c;
if(c=='L')
{
int x;
cin>>x;
a[x]=l--;
}
else if(c=='R')
{
int x;
cin>>x;
a[x]=r++;
}
else
{
int x;
cin>>x;
cout<<min(a[x]-l-1,r-a[x]-1)<<endl;
}
}
return 0;
}