蓝桥杯七夕双周赛 4.仙男仙女【算法赛】 题型:模拟,排序,思维

52 阅读2分钟

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;
}

image.png

有几点我需要说一下.第一点就是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;
}

image.png

说一下这里需要排序的原因。即使 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;
}

image.png