https://vjudge.net/problem/Gym-100247A
题意:
每个绝地武士有三个能力值a,b,c,两个武士决斗时谁有两个值大于对方谁就是胜者(a和a比,b和b比,c和c比,所有武士的三个值都不相同),现在可以交换任意武士的三个能力值位置,问有些可以击败其余所有武士。
思路:
肯定是用自己最大的两个能力值去和别的武士的较低的两个能力值相比,两者皆大就能赢,因为要赢所有人,所以先对所有武士能力排序,这样每个武士的能力值都是递增的了,对每个位置的能力值都维护一个最大值(只要赢了最大值的那个,那肯定能赢其余所有人)和次大值(因为这个最大值可能是自己本身,此时就需要看次大值)。
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int maxn = 200000+5; 7 8 int a[maxn][3]; 9 int mx[3],smx[3]; 10 int q[maxn]; 11 12 int main() 13 { 14 //freopen("in.txt","r",stdin); 15 int n; 16 scanf("%d",&n); 17 for(int i=0;i<3;i++) mx[i] = smx[i] = 0; 18 for(int i=1;i<=n;i++) 19 { 20 scanf("%d%d%d",&a[i][0],&a[i][1],&a[i][2]); 21 sort(a[i],a[i]+3); 22 smx[0] = max(mx[0],a[i][0]); 23 if(smx[0]>mx[0]) swap(mx[0],smx[0]); 24 smx[1] = max(mx[1],a[i][1]); 25 if(smx[1]>mx[1]) swap(mx[1],smx[1]); 26 } 27 28 int ans = 0; 29 for(int i=1;i<=n;i++) 30 { 31 int t1 = mx[0],t2 = mx[1]; 32 if(a[i][0]==t1) t1 = smx[0]; 33 if(a[i][1]==t2) t2 = smx[1]; 34 if(a[i][1]>t1 && a[i][2]>t2) q[ans++]=i; 35 } 36 printf("%d\n",ans); 37 for(int i=0;i<ans;i++) 38 printf("%d%c",q[i],i==ans-1?‘\n‘:‘ ‘); 39 return 0; 40 }