杭电oj平台上的11页题目代码:hdu-page11 (2050~2059)2053、2054、2055、2056、2058、2059...

//2050
/*思路:1.先分析直线分割平面的情况,增加第n条直线的时候,跟之前的直线最多有(n-1)个交点,此时分出的部分多了(n-1)+1个,故递推公式是f[n]=f[n-1]+(n-1)+1;
2.同理分析折线分割平面的情况,增加第n-1条折线的时候,跟之前的n-1条折线最多有2*2(n-1)个交点,此时分出的部分多了2*2(n-1)+1个;
故推出f[n]=f[n-1]+4(n-1)+1.*/
#include<stdio.h>
#include<string.h>
#define MAXN 10001//数组大小刚开始设置为1001,就出现超时错误了,改成10001就AC了
typedef long long ll;
ll f[MAXN];//用来记录不同的n的所分割的平面数
int main()
{
int c;
int i;
int n;
f[1] = 2;
f[2] = 7;
scanf("%d", &c);
while (c--)
{
scanf("%d", &n);
for (i = 3; i <= n; i++)
{
f[i] = f[i - 1] + 4 * (i - 1) + 1;
}
printf("%lld\n", f[n]);
}
return 0;
}

 


//2051
#include<stdio.h>
#include<string.h>
#define MAXN 1001
int f[MAXN];
int main()
{
int n;
int len;
while (~scanf("%d",&n))
{
len = 0;
while (n)
{
f[len++] = n % 2;
n /= 2;
}
//倒着输出
for (int i = len-1; i >= 0; i--)
{
printf("%d", f[i]);
}
printf("\n");
}
return 0;
}

 

//2052
#include<stdio.h>
#include<string.h>
#define MAXN 1001
int f[MAXN];
int main()
{
int n;
int m;
int i;
int j;
int k;
while (~scanf("%d%d",&n,&m))
{
//先打印第一行
printf("+");
for ( i = 0; i < n; i++)
{
printf("-");
}
printf("+\n");
//共有m行
for ( k = 0; k < m; k++)
{
//第二行
printf("|");
//接着打印n个空格
for ( j = 0; j < n; j++)
{
printf(" ");
}
printf("|");

printf("\n");
}
//最后一行
printf("+");
for (i = 0; i < n; i++)
{
printf("-");
}
printf("+\n\n");

}
return 0;
}

 

//2053
//思路:
#include<stdio.h>
#include<string.h>
#define MAXN 1001
int f[MAXN];
int main()
{
int n;
int i;
int j;
int count;
while (~scanf("%d",&n))
{
count = 0;
for (int i = 1; i <= n; i++)
{
if (n%i==0)
{
count++;
}
}
if (count%2==0)
{
printf("0\n");

}
else
{
printf("1\n");
}
}

return 0;
}

 

//2054
/**/
#include<stdio.h>
#include<string.h>
#define N 1000000
char str1[N], str2[N];
int havePoint(char str[])
{
int i, len;
len = strlen(str);
for ( i = 0; i < len; i++)
{
if (str[i] == '.')
return 1;
}
return 0;
}

void change(char str[])
{
int i, len;
len = strlen(str);
if (havePoint(str))
{
for ( i = len-1; str[i]=='0'; i--)
{
str[i] = '\0';
len--;
}
if (str[len-1]=='.')
{
str[len - 1] = '\0';
}
}
}

int main()
{
while (~scanf("%s %s",str1,str2))
{
change(str1);
change(str2);
if (strcmp(str1,str2)==0)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}

 

//2055
//思路:将数字和字母对应起来,a-z:97-122;A-Z:65-90;0-9:48-57
#include<stdio.h>
#include<string.h>
int main()
{
int t;
scanf("%d", &t);
getchar();
int y;
char c;
int sum;
while (t--)
{
sum = 0;
//因为读入的是字符,所以前面需要getchar(),不加getchar()的话就wa了
scanf("%c%d", &c, &y);
if (c>='a'&&c<='z')
{
如果c是‘A’,则(int)(c - 'a' + 1)=1,前面加个负号是f[a]对应的值-1
sum = y -(int)( c - 'a' + 1);
printf("%d\n", sum);
}
else if (c >= 'A'&&c <= 'Z')
{
//如果c是‘A’,则(int)(c - 'A' + 1)=1,刚好是f[A]对应的值1
sum = y + (int)(c - 'A' + 1);
printf("%d\n", sum);
}
getchar();
}
return 0;
}


//2056
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
double x[5];
double y[5];
using namespace std;
int main()
{
double x1, y1, x2, y2, x3, y3, x4, y4;
double l, h;
double s;
while (~scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4))
{
x[0] = x1; x[1] = x2; x[2] = x3; x[3] = x4;
y[0] = y1; y[1] = y2; y[2] = y3; y[3] = y4;
sort(x, x + 4);
sort(y, y + 4);
l = fabs(x2 - x1) + fabs(x4 - x3) - (x[3]-x[0]);
h = fabs(y2 - y1) + fabs(y4 - y3) - (y[3] - y[0]);
s = l*h;
if (l<=0||h<=0)
{
s = 0.00;
}
printf("%.2lf\n", s);
}

return 0;
}

 

//2057
//思路:题目的意思是十六进制的加减,基本的思想:将其先转换为十进制,进行相加减后,再将结果(十进制)转换为十六进制
//用计算机组成原理中的方法,就是先将其转换为(二进制)补码,再进行相加得到结果
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
typedef long long ll;
using namespace std;
int main()
{
ll a, b, result;
//%llx是代表16进制
while (~scanf("%llx %llx",&a,&b))
{
result = a + b;
if (result >= 0)
{
printf("%llX\n", result);
}
else
{
printf("-%llX\n", -result);
}
}
return 0;

}

 

//2058
/*思路:设子序列(sub-sequence)是分别a+1,a+2,a+3,....;d是子序列的长度;
m=sum=a*d+(1+d)*d/2;得出m*2>(1+d)*d.
a*d=m-(d+d*d)/2;
*/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
int n, m;
int d;
int b;
while (~scanf("%d%d",&n,&m))
{
if (n==0&&m==0)
{
break;
}
//按照实际情况d不能等于0
for (d = sqrt(2.0*m); d >0; d--)
{
//b代表a*d,从后向前遍历得到合适的d
b = m - (d + d*d) / 2;
if (b%d==0)
{
printf("[%d,%d]\n",b/d+1,b/d+d);
}
}
printf("\n");
}
return 0;
}

 

//2059
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define MAXN 101
int p[MAXN];
#define MAXN_DP 1001
double dp[MAXN_DP];
using namespace std;
int main()
{
int L;
int N, C, T;
int VR, VT1, VT2;
int i,j;
double tr, time;
while (~scanf("%d",&L))
{
//N代表充电站的个数,C代表电动车充满电以后能行驶的距离,T代表每次充电所需要的时间
scanf("%d%d%d", &N, &C, &T);
//VR表示兔子跑步的速度,VT1表示乌龟开电动车的速度,VT2代表乌龟脚蹬电动车的速度
scanf("%d%d%d", &VR, &VT1, &VT2);
//N个整数p1,p2,,,,pn分别表示各个充电站离跑道起点的距离
for ( i = 1; i <= N; i++)
{
scanf("%d", &p[i]);
}

p[N + 1] = L;
dp[0] = 0;
tr = L*1.0 / VR;
for ( i = 1; i <= N+1; i++)
{
double Min = 99999999;
for ( j = 0; j < i; j++)
{
int x = p[i] - p[j];
if (C>= x)
{
time = x*1.0 / VT1;
}
else
{
time = C*1.0 / VT1 + (x - C)*1.0 / VT2;
}
if (j)
{
time += T;
}
if (Min>dp[j]+time)
{
Min = dp[j] + time;
}
}
dp[i] = Min;
}
if (dp[N+1]>tr)
{
printf("Good job,rabbit!\n");
}
else
{
printf("What a pity rabbit!\n");
}
}


return 0;
}

 

转载于:https://www.cnblogs.com/BlueBlue-Sky/p/8597531.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值