题目大意:一个人想逃,一个人要阻止那个人逃跑 ,阻止者念每一个符咒的时间为b[i],逃跑者念每一个符咒的时间为a[i],逃跑者如果念完了第i个符咒,阻止者还没有念完或者刚好念完这第i个符咒,此时逃跑者就可以逃跑了。(每个人都不知道对方在念哪一个符咒)
队友给讲的解题思路:首先可以想到的是逃跑者用时最短念完的符咒是最危险的(他可能很快念完然后离开了),所以想到要先阻止对方耗时最少的,次少的,,,,最多的; 但是假如有可能你(阻止者)在念他用时最少的符咒,并且你的时间比他少,把这个符咒锁住了,他逃不了,可是如果他根本没念这个,他念的是别的,当你念完最少(或其他的)来念这个时,他用时较少已经念完他就可以逃跑了。可以发现你根本猜不了,所以你要找一个特定的念符咒的顺序,只要这个顺序可以把所有情况都阻止,那他就逃不了了。那么回到思考的最开始,我们依旧是从逃跑者耗时最少的开始,次少的,,,,以此念下去,把逃跑者当成一开始就在念第i个,我们算按我们的顺序到念完第i个点的时间是否比逃跑者少,如果是就可以阻止他从这个点离开,如果每一个点按我们的顺序都能阻止成功,那么就阻止成功了,一旦有一个没有阻止成功,逃跑者就可以逃跑
AC_Code
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <ctime> 5 #include <cmath> 6 #include <algorithm> 7 using namespace std; 8 typedef long long ll; 9 const int maxn=1e5+10; 10 ll n; 11 struct node 12 { 13 ll a; 14 ll b; 15 }s[maxn]; 16 17 bool cmp(struct node x, struct node y) 18 { 19 return x.a<y.a; 20 } 21 22 int main() 23 { 24 ll i,sum=0,flag=0; 25 scanf("%lld",&n); 26 for(i=0;i<n;i++) 27 { 28 scanf("%lld",&s[i].a); 29 } 30 for(i=0;i<n;i++) 31 { 32 scanf("%lld",&s[i].b); 33 } 34 35 sort(s,s+n,cmp); 36 37 for(i=0;i<n;i++) 38 { 39 sum += s[i].b; 40 if( sum<s[i].a ) 41 { 42 flag++; 43 } 44 } 45 if( flag==n ) printf("Dire victory "); 46 else printf("Redemption "); 47 48 return 0; 49 }