Gym 100247AThe Power of the Dark Side

Posted 谦谦君子,陌上其华

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gym 100247AThe Power of the Dark Side相关的知识,希望对你有一定的参考价值。

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 }

 

以上是关于Gym 100247AThe Power of the Dark Side的主要内容,如果未能解决你的问题,请参考以下文章

Gym 100247CVictor's Research(有多少区间之和为S)

The Stream of Corning 2 --- Gym - 102091K(区间第 k 大--权值线段树)

power of two

Gym - 101670J Punching Power(最大独立集)

题解 UVA11149 Power of Matrix

Codeforces1560 D. Make a Power of Two(思维+暴力)