T1 Herdle(牧群)
T2 Non-Transitive Dice (非传递骰子)
众所周知,每一次打开题目,我们都要注意 数据范围。
emmm……
$1\le T\le 10$
并且,我们要枚举的这个骰子是一个 四面骰子,而每一面上的数字 仅仅是 $1\sim 10$。
考虑深搜。
每次从 $1\sim 10$ 里选一个数字,如此执行 $4$ 次,时间复杂度为 $O(10^4\times T)$,完全可以通过。
再来分析一下 判定函数:
举个栗子,
$A=\{4,5,6,7\}$
$B=\{2,4,5,10\}$
其中,有:
$A_1>B_1,A_2>B_1,A_3>B_1\dots$
合起来,
序列 $A$ 中的数字大于 $B$ 的有 $9$ 次;
序列 $B$ 中的数字大于 $A$ 的则有 $5$ 次!
因此,我们就说 $A$ 能战胜 $B$!
由此,可得出以下程序:
1 bool check(int x[],int y[]) //计算x能否赢y 2 { 3 int cntx=0,cnty=0; 4 for(int i=1;i<5;i++) 5 { 6 for(int j=1;j<5;j++) 7 { 8 if(x[i]>y[j]) 9 ++cntx; 10 else if(x[i]<y[j]) 11 ++cnty; 12 } 13 } 14 return cntx>cnty; 15 }Check函数
至此,这题完全结束。
下面给出 完整代码。
Code:
1 #include<bits/stdc++.h> 2 #define isdight(c) (c>='0'&&c<='9') 3 using namespace std; 4 int t,a[5],b[5],c[5],flag=0; 5 inline int read() //快读 6 { 7 int x=0,f=1; 8 char c=getchar(); 9 while(!isdight(c)) 10 f=(c^'-'?1:-1),c=getchar(); 11 while(isdight(c)) 12 x=(x<<1)+(x<<3)+(c-'0'),c=getchar(); 13 return x*f; 14 } 15 bool check(int x[],int y[]) //计算x能否赢y 16 { 17 int cntx=0,cnty=0; 18 for(int i=1;i<5;i++) 19 { 20 for(int j=1;j<5;j++) 21 { 22 if(x[i]>y[j]) 23 ++cntx; 24 else if(x[i]<y[j]) 25 ++cnty; 26 } 27 } 28 return cntx>cnty; 29 } 30 void dfs(int dep) //核心部分 31 { 32 if(dep>4) 33 { 34 if((check(a,b)&&check(b,c)&&check(c,a))||(check(b,a)&&check(a,c)&&check(c,b))) //满足非传递性 35 flag=1; 36 return; 37 } 38 if(flag) 39 return; 40 for(int i=1;i<11;i++) //递归 41 { 42 c[dep]=i; 43 dfs(dep+1); 44 } 45 } 46 int main() 47 { 48 t=read(); 49 while(t--) 50 { 51 flag=0; 52 for(int i=1;i<5;i++) 53 a[i]=read(); 54 for(int i=1;i<5;i++) 55 b[i]=read(); 56 sort(a+1,a+5); 57 sort(b+1,b+5); 58 //排序,预处理 59 dfs(1); 60 if(flag) 61 puts("yes"); 62 else 63 puts("no"); 64 } 65 return 0; 66 }T2 完整代码
T3 Drought(干旱)