第一题:就是第n项等于前6项和。
注意限时比较紧,只有0.5s。所以用循环把结果存入数组。递归估计就TLE了
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long LL;
const int MOD = 10000007;
LL f[10005];
int main()
{
int t;
int kase=1;
scanf("%d",&t);
int n;
while(t--)
{
cin>>f[0]>>f[1]>>f[2]>>f[3]>>f[4]>>f[5]>>n;
for(int i=6;i<=n;i++)
{
f[i]=(f[i-1]+f[i-2]+f[i-3]+f[i-4]+f[i-5]+f[i-6])%MOD;
}
printf("Case %d: ",kase++);
cout<<f[n]%MOD<<endl;
}
}
第二题:给个棋盘,黑白格相间。问最多能放多少个马,马之间不会打架。。
考虑到,马的走法。我全部放白或者黑就可以了,但是有特殊情况。就是棋盘有一边等于1的时候,全部放上就行。棋盘有一边等于2的时候,我就放一个田字格,中间间隔一个田字格。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
typedef LL long long
int main()
{
int T;
scanf("%d",&T);
int cas=0;
while(T--)
{
cas++;
int n,m,x,y;
scanf("%d%d",&n,&m);
if(n>m)swap(n,m);
x=n*m;
x=x/2;
y=n*m-x;
y=max(x,y);
if(n==1)x=m;
if(n==2)x=2*(2*(m/4)+min(2,m%4));
printf("Case %d: %d\n",cas,max(x,y));
}
return 0;
}
第三题:全部1A,水模拟,读懂题意写写就好了。
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;
int main()
{
int t,kase=1,l,r;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&l,&r);
if(l>r)
{
printf("Case %d: %d\n",kase++,(2*l-r)*4+19);
continue;
}
l=max(l,r);
printf("Case %d: %d\n",kase++,l*4+19);
}
return 0;
}
第四题:也是水题,判断一下坐标关系就行了。
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
using namespace std;
int main()
{
int t,kase=1,x1,x2,y1,y2,m,a,b;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
scanf("%d",&m);
printf("Case %d:\n",kase++);
while(m--)
{
scanf("%d%d",&a,&b);
if(x1<a&&a<x2&&y1<b&&b<y2)
printf("Yes\n");
else
printf("No\n");
}
}
}
第五题:几何题。
如图,就是给大圆的半径和小圆的个数,求小圆半径。
这道题可以二分小圆半径,然后check。
也可以直接找几何关系。从大圆圆心连一条任意小圆的切线,切点连接该小圆圆心,构成一个直角三角形。然后用三角函数列式子就能解了。
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
using namespace std;
const double PI=acos(-1.0);
int main()
{
int t,kase=1;
scanf("%d",&t);
double R,n,alpha,r;
while(t--)
{
cin>>R>>n;
alpha=PI/n;
r=sin(alpha)*R/(1+sin(alpha));
printf("Case %d: %.8lf\n",kase++,r);
}
return 0;
}
第六题:个人认为是好题。
给出一个n,求出一个比他大,且二进制的1的个数相同的第一个数。
硬模拟,我试过几次优化,感觉都不能过。
这里用的STL的next_permutation()就是求出下一个排列。
然后用字符串模拟一下,注意有可能该个数就是最大的排列,它的下一个需要特殊处理一下。
(这道题,理解有困难的,看看STL,string和基础的位运算)
另外gcc内置有几个位运算的函数,我之后尝试下可以不可以过。
给一篇好的位运算的文章:
http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=bitManipulation
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;
int fun(string a)
{
int ans=1;
for(int i=1;i<a.size();i++)
{
if(a[i]=='0')
ans=(ans << 1);
else
ans=(ans << 1 | 1);
}
return ans;
}
int main()
{
int t,kase=1;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
string str="";
while(n)
{
if(n&1)
str.insert(0,"1");
else
str.insert(0,"0");
n/=2;
}
if(!next_permutation(str.begin(),str.end()))
{
str.insert(0,"10");
str.erase(str.size()-1,1);
}
printf("Case %d: %d\n",kase++,fun(str));
}
}