丢手绢

版权声明:未经过同意不得转载 https://blog.csdn.net/qq_42500298/article/details/88430038

在这里插入图片描述
在这里插入图片描述

这道题我的思路是sort一下手绢的能力值然后枚举Ai看一下当前人有没有手绢,如果有的话则下一个,没有则把当前这个手绢给这个小朋友,就是一个贪心的思路但是每个手绢对应的能力值是固定的所以既有位置约束着 又有权值约束着(贪心基本上要贪你得按照一维去贪),所以肯定是错的。。。只有40分
后来的思路,发现其实我当时的思路没有什么太大问题,就是不能把手绢分给最近的小朋友而应该是看一下哪个小朋友能刚刚(最接近)好符合拿走这个手绢的条件,用upper_bound就行了,找出第一个大于它的。

#include<bits/stdc++.h>
using namespace std;
#define ha pair<int,int>
const int maxn=1000000;
vector<int> v[maxn];
set<int> s;
int main()
{
 int n,ans=0;
 bool flag=0;
 scanf("%d",&n);
 int a[n+1],b[n+1],c[n+1],g[n+1];
 memset(g,-1,sizeof(g));
 for(int i=0;i<n;i++)
  scanf("%d",&a[i]),a[i]--;
 for(int i=0;i<n;i++)
  scanf("%d",&b[i]);
 for(int i=0;i<n;i++)
  scanf("%d",&c[i]),g[a[i]]++,v[a[i]].push_back(c[i]);
 ha minn=ha(1000000,1000000);
 for(int i=0;i<n;i++)
 {
  if(i)
   g[i]+=g[i-1];
  minn=min(minn,ha(g[i],i));
 }
 int u=(minn.second+1)%n;
 for(int j=0;j<n;j++)
 {
  int i=(j+u)%n;
  for(int k=0;k<v[i].size();k++)
   s.insert(v[i][k]);
  set<int>::iterator it=s.upper_bound(b[i]);
     if(it==s.end())
   s.erase(s.begin());
     else
  {
   ans++;
   s.erase(it);
  }
 } 
 cout<<ans<<endl; 
 return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42500298/article/details/88430038