题目链接
LightOJ-1010
LightOJ-1008
LightOJ-1020
LightOJ-1008
思路
很多方法吧,我是观察到每轮的结束时1,4,9,25,36~~~,就是平方数,然后在判断它的偏移就好了。
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| #include<bits/stdc++.h> using namespace std; #define ll long long int main(){ int t; scanf("%d",&t); for(int cas = 1;cas<=t;cas++){ ll x; scanf("%lld",&x); int pos = (int)sqrt(x); if(1ll*pos*pos!=x)pos++; int num = 2*pos-1; ll re = 1ll*pos*pos-x; printf("Case %d: ",cas); if(pos&1){ if(re>num/2){ printf("%d %d\n",pos,pos-(re-num/2)); }else{ printf("%d %d\n",1+re,pos); } }else{ if(re>num/2){ printf("%d %d\n",pos-(re-num/2),pos); }else{ printf("%d %d\n",pos,1+re); } } } }
|
LightOJ-1010
思路
这个题,当仅为1行或者1列的时候答案很显然,但是当为n=2或者m=2的时候就要如图一这种方式,n>=3的时候就交叉着涂
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| #include<bits/stdc++.h> using namespace std; #define ll long long ll getans(int n,int m){ int mi = min(n,m); int mx = max(n,m); int bmx = mx/2,bmi=mi/2; ll res = 0; if(mi&1){ if(mx&1){ res+=(mx/2+1)*(mi/2+1); res+=(mx/2)*(mi/2); }else{ res+=(mx/2)*mi; } }else{ res+=(mi/2)*mx; } return res; } int main(){ int t; scanf("%d",&t); for(int cas=1;cas<=t;cas++){ int n,m; scanf("%d %d",&n,&m); ll ans = getans(n,m); if(n<m)swap(n,m); if(m==1){ ans=n; }else if(m==2){ ans= (n/4)*4 + min(n%4,2)*2; } printf("Case %d: %lld\n",cas,ans); } }
|
LightOJ-1020
思路
很简单的博弈,手推几个就能推出结论。
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include<bits/stdc++.h> using namespace std; #define ll long long const int N = 1e5+10; char s[100]; int main(){ int t; scanf("%d",&t); for(int cas=1;cas<=t;cas++){ ll n; scanf("%lld %s",&n,s); printf("Case %d: ",cas); if(s[0]=='A'){ if(n%3==1)printf("Bob\n"); else printf("Alice\n"); }else{ if(n%3!=0)printf("Bob\n"); else printf("Alice\n"); } } }
|