4.仙男仙女【算法赛】 - 蓝桥云课 (lanqiao.cn) 模拟题,按照题意模拟即可.
我刚开始这样写的,怎么都过不了:
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int N=1e5+10;
vector<PII> a;
int cnt;
bool cmp(pair<int , int>& a , pair<int , int>& b) {return a.first < b.first;}
int main()
{
int n;cin>>n;
for(int i=0;i<n;i++) cin>>a[i].first;
for(int i=0;i<n;i++)cin>>a[i].second;
if(n==1)
{
cout<<1<<endl;
return 0;
}
sort(a.begin(),a.end(),cmp);
for(int i = 0 ; i < n; i++) {
if(a[0].first + a[0].second < a[1].first) cnt++;
else if(a[n - 1].first - a[n - 1].second > a[n - 2].first) cnt++;
else if(a[i].first - a[i].second > a[i - 1].first && a[i].first + a[i].second < a[i + 1].first) cnt++;
}
cout<<cnt<<endl;
return 0;
}
有几点我需要说一下.第一点就是vetcor没有通过puhs_back()添加元素,直接通过cin>>a[i].first;这样输入会造成越界.
所以需要手动开辟: vector a(n);
第二点就是,
if(a[0].first + a[0].second < a[1].first) cnt++;
if(a[n - 1].first - a[n - 1].second > a[n - 2].first) cnt++;
for(int i = 1 ; i < n - 1 ; i++)
{
if(a[i].first - a[i].second > a[i - 1].first && a[i].first + a[i].second < a[i + 1].first)
cnt++; }
这里应该把a[0]和a[1]这种特殊情况拿出for循环外进行特判.不然会在循环里被判断很多次:
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int N=1e5+10;
int cnt;
bool cmp(pair<int , int>& a , pair<int , int>& b) {return a.first < b.first;}
int main()
{
int n;cin>>n;
vector<PII> a(n);
for(int i=0;i<n;i++) cin>>a[i].first;
for(int i=0;i<n;i++)cin>>a[i].second;
if(n==1)
{
cout<<1<<endl;
return 0;
}
sort(a.begin(),a.end(),cmp);
if(a[0].first + a[0].second < a[1].first) cnt++;
if(a[n - 1].first - a[n - 1].second > a[n - 2].first) cnt++;
for(int i = 1 ; i < n - 1 ; i++) {
if(a[i].first - a[i].second > a[i - 1].first && a[i].first + a[i].second < a[i + 1].first) cnt++;
}
cout<<cnt<<endl;
return 0;
}
说一下这里需要排序的原因。即使 p[i] - a[i] > p[i-1] 和 p[i] + a[i] < p[i+1] 成立,也不能保证在 [p[i] - a[i], p[i] + a[i]] 区间内没有其他仙女,因为可能存在 p[j](其中 j 不等于 i-1 或 i+1)在这个区间内。
其次我如果用两个单独的数组分别存放位置和安全距离,也是错误的。因为我对p数组进行了排序,就打乱了原有两个数组之间的关联性。换句话说就是排完序之后现在的p数组的每个元素不是对应原有的a数组的每个元素了。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e9+10;
//int p[N], a[N];
int cnt;
void solve()
{
int n;
cin >> n;
vector<int>p(n); vector<int>a(n);
for (int i = 0; i < n; i++)
cin >> p[i];
for (int i = 0; i < n; i++)
cin >> a[i];
sort(p.begin(),p.end());
if (n == 1) {
cout << 1 << endl;
return;
}
if (p[0] + a[0]< p[1])
cnt++;
if (p[n - 1] - a[n - 1] > p[n - 2])
cnt++;
for (int i = 1; i < n - 1; i++) {
if (p[i] - a[i] > a[i - 1] && p[i] + a[i] < p[i + 1])
cnt++;
}
cout << cnt << endl;
}
signed main() {
int t=1;
while(t--)
{
solve();
}
cin.tie(nullptr)->sync_with_stdio(false);
return 0;
}