HDU 5512 Pagodas(等差数列)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 5512 Pagodas(等差数列)相关的知识,希望对你有一定的参考价值。
题意:给你三个数:n,a,b,一开始一个集合里面有两个数:a和b,然后两个人轮流往这个集合里面增加数字,增加的这个数字的原则是,这个集合里面任选两个数的和或差,集合里面的数字不能重复,同时这个数字不能大于 n 。(本来说的造塔,这样说方便一点)
思路:本来还以为是博弈,但是后来把数字的加减都模拟一遍之后发现,无论怎样,最后得到的这个集合里面的数列,其实是一个等差数列,所以这就简单了,由一开得到的 a 和 b 来相减,然后不断地取最小的两个数相减,然后等到等差数列的差,这个差同时也是等差数列一开始的那个数字,然后拿 n 除以这个差就是在 n 的范围内可以得到的数字的个数了,然后因为分先手和后手,所以最后只要判断一下个数的奇偶数就可以得到答案了。
P.S.这道题又犯傻了,明明都已经找到规律了,结果还想着二分,明明拿个 n 除以那个差就好了······
1 #include<stdio.h> 2 #include<iostream> 3 #include<string.h> 4 #include<math.h> 5 #include<algorithm> 6 #include<vector> 7 #include<string> 8 #include<queue> 9 #include<map> 10 #include<stack> 11 #include<set> 12 #define ll long long 13 #define PI acos(-1.0) //圆周率 14 const int mod=1e9+7; 15 const int maxn=1e6+10; 16 using namespace std; 17 int T,n,a,b; 18 int max(int l,int r) 19 { 20 if(l>r) return l; 21 else return r; 22 } 23 int min(int l,int r) 24 { 25 if(l>r) return r; 26 else return l; 27 } 28 int main() 29 { 30 int cas=0; 31 scanf("%d",&T); 32 while(T--) 33 { 34 scanf("%d %d %d",&n,&a,&b); 35 36 if(a<b) swap(a,b); 37 int cnt=0; 38 while(1) 39 { 40 cnt=a-b; 41 42 if(b==cnt) break; 43 44 a=max(b,cnt); 45 b=min(b,cnt); 46 } 47 48 int ans=n/cnt; 49 50 printf("Case #%d: ",++cas); 51 if(ans%2==0) printf("Iaka\n"); 52 else printf("Yuwgna\n"); 53 } 54 55 return 0; 56 }
以上是关于HDU 5512 Pagodas(等差数列)的主要内容,如果未能解决你的问题,请参考以下文章