2050.折线分割平面
http://acm.hdu.edu.cn/showproblem.php?pid=2050
直线:第n条与之前的有 n-1 个交点,(n-1)+1 个平面;
折线:第n条最多与之前的有2∗2(n−1)交点(一折两直), 2∗2(n−1)+1个平面,
递推f(n)=f(n−1)+4n−3
第一种:
#include
int cal(int n)
{
return n==1?2:(cal(n-1)+4*(n-1)+1);
}
int main()
{
int c,n;
scanf("%d",&c);
while(c--){
scanf("%d",&n);
printf("%d\n",cal(n));
}
return 0;
}
第二种:
#include
int main()
{
int c,n;
__int64 f[10001]={0,2,7};
for(int i=3;i<=10000;i++){
f[i]=f[i-1]+4*i-3;
}
scanf("%d",&c);
while(c--){
scanf("%d",&n);
printf("%I64d\n",f[n]);
}
return 0;
}
2051.Bitset
和2031.进制转换差不多
http://acm.hdu.edu.cn/showproblem.php?pid=2051
#include
int main()
{
int n,i, arr[500], t = 0;
while (~scanf("%d", &n) )
{
for ( i = 0; n!=0; i++)
{
arr[i] = n % 2;
n = n / 2;
}//i++是先执行再自增,多1
for (int j = i-1; j >= 0; j--)
printf("%d", arr[j]);
printf("\n");
}
return 0;
}
2052.Picture
和2032.杨辉三角差不多,但是不要用数组做,数组会覆盖
#include
int main()
{
int n,m,i;
while(~scanf("%d%d",&n,&m))
{
printf("+");
for( i=0;i<n;i++)
printf("-");
printf("+\n");
for( i=0;i<m;i++)
{
printf("|");
for(int j=0;j<n;j++)
printf(" ");
printf("|\n");
}
printf("+");
for( i=0;i<n;i++)
printf("-");
printf("+\n");
printf("\n");
}
return 0;
}
2053Switch Game
http://acm.hdu.edu.cn/showproblem.php?pid=2055
就是除了 n*n 是 1 ,其余的都是 0
#include
#include
int main()
{
int n,k;
while(~scanf("%d",&n)){
k=sqrt(n);
if(k*k==n)
printf("1\n");
else
printf("0\n");
}
return 0;
}
2054
2055.An easy problem
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2055
本题要是有人设52个变量的话就有点沙雕了
我是利用ascii码来算的
大写A是65 Z是90
A若要为1,只能65-64
小写a是97 z是122
a先乘-1再加96就能变为-1
#include
int main()
{
char i;
int a,n;
scanf("%d",&n);
while(n--)
{
scanf("%s %d",&i,&a);//输入
int j=i;//转换为整数型
int k=0;
if(i>='A'&&i<='Z')//输入为大写时
k=j-64;
else //输入为小写时
k=(-1)*j+96;
printf("%d\n",k+a);
}
return 0;
}
2056.Rectangles
http://acm.hdu.edu.cn/showproblem.php?pid=2056
翻译了c语言版本
http://blog.sina.com.cn/s/blog_ac5ed4f30101dr2z.html
#include
int main()
{
double x1,y1,x2,y2,x3,y3,x4,y4,a,b,c,d,t;
while(~scanf("%lf%lf%lf%lf %lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4))
{
if(x1>x2) {t=x1;x1=x2;x2=t;}
if(x3>x4) {t=x3;x3=x4;x4=t;}
if(y1>y2) {t=y1;y1=y2;y2=t;}
if(y3>y4){t=y3;y3=y4;y4=t;}
if(y2<y3||x2<x3||y1>y4||x1>x4)//最大的比你最小的还小,没的玩
printf("0.00\n");
else
{
if(x1<=x3)//双方最小的比较
a=x3;
else
a=x1;
if(x2<=x4)//最大的比较
b=x2;
else
b=x4;
if(y1<=y3)//最小的比较
c=y3;
else
c=y1;
if(y2<=y4)//最大的比较
d=y2;
else
d=y4;
printf("%.2lf\n",(b-a)*(d-c));//长×宽,有些解法是用fabs绝对值
}
}
return 0;
}
2057.A + B Again
http://acm.hdu.edu.cn/showproblem.php?pid=2057
首先考虑范围大,其次对于负数需要注意
大写的X对应大写字母,小写x对应小写字母
16进制是%x ,大数就%I64x
8进制是%o
10进制是%d
不管是8进制还是16进制都是一样的方法
#include
int main()
{
__int64 a,b,c;
while(scanf("%I64X %I64X",&a,&b)!=EOF){
c=a+b;
if(c>=0) {printf("%I64X\n",c);}
else {printf("-%I64X\n",-c);}//正常是无法输出负数的
}
return 0;
}
2058.The sum problem
http://acm.hdu.edu.cn/showproblem.php?pid=2058
首项为a,如果个数为t,则尾项为a+t-1
等差数列公式:
(a+(a+t-1))*t/2=m
化简求得a=m/t+(t-1)/2,
先求t
#include
int main()
{
double n,m,a,t,i;
while(~scanf("%lf%lf",&n,&m))
{if(n==0&&m==0) break;
for(i=0;i<m;i++)
{
a=m/i-(i-1)/2;
if(a<1) break;
}//目的是为了限制a和t的范围,首项a有可能是负的
for(t=i-1;t>=0;t--)//t是为了求长度,t=i-1是因为i++的性质
{
a=m/t-(t-1)/2;
if(a-(int)a==0.0) //还是为了限制a
printf("[%d,%d]\n",(int)a,(int)a+(int)t-1);
}
printf("\n");
}
return 0;
}