题意
tournament 锦标赛
agility 敏捷
intelligence 智力
strength 力量
parameter 参数
restriction 限制
一个Jedi有三个参数,当两个Jedi打架的时候,拥有至少两个高于对方相应参数的Jedi获胜。
可以使一只Jedi黑化,黑化后可以重置参数,但是参数不能为负数,且三个参数的总和不变。
对于每一个Jedi,计算出它黑化后可以击败的数量。
题解
三个参数排序,前两个的值pre,三个值的和sum,对pre进行排序,对数组pre对sum进行二分搜索,寻找位置。
这一题细节很多,特别是第三点,太细了!!!
一:sum-2,因为至少两个值要大于
二:当3个
1
0
9
10^9
109相加会爆 int,用long long 存
三:当arr[2] <= 1时,记录一下特殊情况,pos不用减一。因为用sum-2去搜索的,假设arr[2]<=1,那这种情况就不包含自己了,其他情况都包含自己。
代码
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define ll long long
const int N = 5e5+5;
ll pre[N];
ll sum[N];
ll d[N];
void solve()
{
int n;
scanf("%d",&n);
rep(i,0,n-1){
ll arr[3];
scanf("%lld %lld %lld",&arr[0], &arr[1], &arr[2]);
sort(arr,arr+3);
pre[i] = arr[0] + arr[1];
sum[i] = arr[0]+arr[1]+arr[2];
if(arr[2]<=1) d[i]=1; // 参考别人的代码
}
sort(pre,pre+n);
rep(i,0,n-1){
ll pos = upper_bound(pre,pre+n,sum[i]-2)-pre; // 注意这里每个para都要大于,所以减去2
if(pos==0||d[i]==1) printf("%lld%c",pos,i==n-1?'\n':' ');
else printf("%lld%c",pos-1,i==n-1?'\n':' ');
}
}
int main() {
solve();
return 0;
}
别人的代码:https://www.cnblogs.com/ccsu-kid/p/11102610.html
感想
本来打算放弃来着,直接用别人的代码交,没想到最后抱着试一试的态度,成功了。
失败的原因只有一种,就是在抵达成功前选择放弃!!
但也侧面反映了这只是运气问题,还不够强,继续加油!