51nod 1191 消灭兔子
51nod的题都好恶心,这个题一开始我想的是把b[i]放里面然后枚举每个箭找能杀死的兔子,因为lower是找兔子里面大于等于这个箭的.我一开始想把迭代器--然后找.最后一直没调过,发现只需要把伤害和兔子的血量变为负值,就可以直接二分了在对钱和伤害排序的时候,因为我要把价格从小到大,然后箭的攻击从大到小,因为变为了负值,对其从小到大就是对其从大到小.
#include<bits/stdc++.h>
#define fp(i,a,b) for(int i=a;i<=b;i++)
typedef long long ll;
typedef double dl;
using namespace std;
const int N=2e5+7;
const int INF=0x3f3f3f3f;
ll n,m;
struct node{
ll d,q;
}s[N];
ll b[N];
bool cmp(node a,node b)
{
if(a.q==b.q) return a.d<b.d;
return a.q<b.q;
}
bool cmp1(int a,int b)
{
return a>b;
}
multiset<ll> st;
void solve()
{
while (scanf("%lld %lld",&n,&m)!=EOF)
{
st.clear();
for(int i=1;i<=n;i++) scanf("%lld",&b[i]),st.insert(-b[i]);
for(int i=1;i<=m;i++) scanf("%lld%lld",&s[i].d,&s[i].q),s[i].d=-s[i].d;
sort(s+1,s+m+1,cmp);
//sort(b+1,b+n+1,cmp1);
int sum=0;
if(n>m)
{
printf("No Solution\n");
continue;
}
int flag=0;
for(int i=1;i<=m;i++)
{
if(st.empty()==1)
{
flag=1;
break;
}
auto it=st.lower_bound(s[i].d);
if(it==st.end()) continue;
sum+=s[i].q;
st.erase(it);
}
if(st.empty()) flag=1;
if(!flag) printf("No Solution\n");
else printf("%lld\n",sum);
}
}
int main()
{
//ios::sync_with_stdio(0);
//cin.tie(0),cout.tie(0);
//int T; scanf("%d",&T);
//for(int i=1;i<=T;i++)
solve();
}
//11.22 ccpc省赛
//11.28 天梯赛
//12.12-13 上海
//12.19-20 南京
//12.26-27 济南
查看9道真题和解析
顺丰集团工作强度 276人发布