杭电OJ第11页2050~2054算法题(C语言)

news/2024/11/7 22:42:47/

目录

  • 2050.折线分割平面
  • 2051.Bitset
  • 2052.Picture
  • 2053.Switch Game
  • 2054.A == B ?

2050.折线分割平面

Problem Description
我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面
的最大数目。比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下
所示。
Input
输入数据的第一行是一个整数C,表示测试实例的个数,然后是C 行数据,每行包含一个整数
n(0<n<=10000),表示折线的数量。
Output
对于每个测试实例,请输出平面的最大分割数,每个实例的输出占一行。
Sample Input
2
1
2
Sample Output
2
7

在这里插入图片描述
分析:
背景知识:由最初的直线分平面可知,交点的个数决定了射线和线段的条数,进而决定了新增的区域数。同理当用折线分割平面时,折线之间的交点越多,所分割的平面数也就越多。
解决思路:一般来说,直接计算n条折线可分割的最大平面数比较困难,此时可以考虑从最简单的情况入手(例如n=1、n=2、…,进而找出规律),也可以尝试找出n条折线与n-1条折线可分割的最大平面数之间的递推关系。
推导递推式:设fold[i]表示i条折线可分割的最大平面数,则fold[1]=2,那么有n-1条折线时,可分割的最大平面数为fold[n-1]。为了使分割的平面数最多,第n条折线两边的线段要和原来的n-1条折线的边,即2*(n-1)条线段相交,那么易知新增的交点数为4*(n-1)+1(包括第n条折线本身的顶点),又通过分析可知,新增的交点数即为新增的平面数,所以得到如下的递推式:
fold[n]=fold[n-1]+4(n-1)+1=fold[n-2]+4(n-2)+4(n-1)+2=…=fold[1]+4+4*2+…+4(n-1)+(n-1)=2n2-n+1

#include <stdio.h>void FoldLine(){int n,line;scanf("%d",&n);while(n--){scanf("%d",&line);if(line<=0 || line>10000){printf("折线数量的取值范围为(0,10000]之间的整数!\n");continue;}printf("%d\n",2*line*line-line+1);}
}

2051.Bitset

Problem Description
Give you a number on base ten,you should output it on base two.(0 < n < 1000)
Input
For each case there is a postive number n on base ten, end of file.
Output
For each case output a number on base two.
Sample Input
1
2
3
Sample Output
1
10
11

分析:本题与2031进制转换较为类似,且更为简单,只需要将输入的十进制转换为二进制即可。

#include <stdio.h>void TenToTwo(){int n,two[11],i,j;while(scanf("%d",&n)!=EOF){if(n<=0 || n>=1000) {printf("n的取值范围为(0,1000)之间的整数!\n");continue;}i=0;while(n>0){two[i]=n%2;n/=2;i++;}for(j=i-1;j>=0;j--){printf("%d",two[j]);}printf("\n");}
}

2052.Picture

Problem Description
Give you the width and height of the rectangle,darw it.
Input
Input contains a number of test cases.For each case ,there are two numbers 
n and m (0 < n,m < 75)indicate the width and height of the rectangle.Iuput 
ends of EOF.
Output
For each case,you should draw a rectangle with the width and height giving 
in the input.
after each case, you should a blank line.
Sample Input
3 2
Sample Output
+---+
|   |
|   |
+---+

分析:按照题目要求画出矩阵即可。

#include <stdio.h>void DrawLine(int n){int i;printf("+");for(i=0;i<n;i++){printf("-");}printf("+\n\n");
}void DarwRectangle(){int n,m,i,j;while(scanf("%d%d",&n,&m)!=EOF){if(n<=0 || n>=75 || m<=0 || m>=75){printf("长和宽的取值范围均为(0,75)之间的整数!\n");continue;}DrawLine(n);for(i=0;i<m;i++){printf("|");for(j=0;j<n;j++){printf(" ");}printf("|\n\n");}DrawLine(n);printf("\n");}
}

2053.Switch Game

Problem Description
There are many lamps in a line. All of them are off at first. A series of 
operations are carried out on these lamps. On the i-th operation, the 
lamps whose numbers are the multiple of i change the condition ( on to off 
and off to on ).
Input
Each test case contains only a number n ( 0< n<= 10^5) in a line.Output
Output the condition of the n-th lamp after infinity operations ( 0 - off,1 - on ).
Sample Input
1
5
Sample Output
1
0
Hint
Consider the second test case:The initial condition	   : 0 0 0 0 0 …
After the first operation  : 1 1 1 1 1 …
After the second operation : 1 0 1 0 1 …
After the third operation  : 1 0 0 0 1 …
After the fourth operation : 1 0 0 1 1 …
After the fifth operation  : 1 0 0 1 0 …The later operations cannot change the condition of the fifth lamp any more. So the answer is 0.

分析:在1~n次的操作中,若n是i的倍数,则count++(初值为0),在第n次操作结束后,在用count对2取余,其结果即为第n个指示灯的状态。

#include <stdio.h>void SwitchGame(){int i,n,count;while(scanf("%d",&n)!=EOF){count=0;for(i=1;i<=n;i++){if(n%i==0){count++;}}printf("%d\n",count%2);}
}

2054.A == B ?

Problem Description
Give you two numbers A and B, if A is equal to B, you should print "YES", 
or print "NO".
Input
each test case contains two numbers A and B.
Output
for each case, if A is equal to B, you should print "YES", or print "NO".
Sample Input
1 2
2 2
3 3
4 3
Sample Output
NO
YES
YES
NO

分析:本题看似简单,实际上需要考虑输入的格式不同,例如输入的004和4.0,需要做统一的处理后再进行比较。

#include <stdio.h>
#include <string.h>//将输入的数字看成字符串作统一的处理,然后再比较
void StrUnify(char str[]){int length=strlen(str),c,i;//检测有无小数点,若没有则在末尾补小数点for(i=0;i<length;i++){if(str[i]=='.') break;if(i==length-1){str[length]='.';str[length+1]='\0';break;}}//判断符号 if(str[0]=='+' || str[0]=='-'){length=1;}else {length=0;	}//首部去0 while(str[length]=='0'){c=length;if(str[length+1]=='.') break;while(1){str[c]=str[c+1];if(str[c+1]=='\0') break;c++;}}//尾部去0length=strlen(str);while(str[length-1]=='0'){str[length-1]=str[length];length--;}
}void EqualNum(){char a[10000],b[10000];long n,m,c;while(scanf("%s %s",a,b)!=EOF){StrUnify(a);StrUnify(b);if(a[0]=='-' && (b[0]=='+'||b[0]>='0')){printf("NO\n");continue;}if(b[0]=='-' && (a[0]=='+'||a[0]>='0')){printf("NO\n");continue;}n=m=0;if(a[0]=='+'||a[0]=='-') n++;if(b[0]=='+'||b[0]=='-') m++;c=0;while(a[n]!='\0' || b[m]!='\0'){if(a[n]!=b[m]){c++;break;}n++;m++;}if(c==0){printf("YES\n");}else{printf("NO\n");}}
} 

杭电OJ第11页2055~2059算法题(C语言)


http://www.ppmy.cn/news/622437.html

相关文章

通过KXTF9-2050芯片分析I2C协议

1、I2C协议 参见博客&#xff1a;《I2C通信协议详解和通信流程分析》。 2、I2C驱动的框架分析 (1)驱动框架分为两层&#xff1a;物理层和协议层。物理层是通用的&#xff0c;取决于主设备&#xff1b;协议层则每个从设备都不同。 (2)物理层&#xff1a;物理层可以理解成通用层&…

洛谷B2050题解

三角形判断 又到了玩球的时间了 #include <iostream> using namespace std; int main(){int a,b,c;cin >> a >> b >> c;if(ab>c&&bc>a&&ca>b)//ture的条件。cout << 1;//tureelse//其他情况。cout << 0;//false…

洛谷B2050 三角形判断

三角形判断 题目描述 给定三个正整数&#xff0c;分别表示三条线段的长度&#xff0c;判断这三条线段能否构成一个三角形。 输入格式 输入共一行&#xff0c;包含三个正整数&#xff0c;分别表示三条线段的长度&#xff0c;数与数之间以一个空格分开。&#xff08;三条边的…

hdu2050

添加链接描述 #include<bits/stdc.h> using namespace std; int f[10001]; int main() {int c,n;f[1]2;f[2]7;for(int i3;i<10001;i) f[i]f[i-1]4*(i-1)1;cin>>c;while(c--){cin>>n;cout<<f[n]<<endl;}return 0; }

杭电OJ2050——折线分割平面(递推)C语言解析

题目传送门 折线分割平面 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 53300 Accepted Submission(s): 34887 Problem Description 我们看到过很多直线分割平面的题目&#xff0c;今天的这个题目稍微有些变化&am…

c语言 error2050,c语言程序设计20509new.doc

c语言程序设计20509new.doc 【程序】题目&#xff1a;有1、2、3、4个数字&#xff0c;能组成多少个互不相同且无重复数字的三位数&#xff1f;都是多少&#xff1f;1.程序分析&#xff1a;可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去       掉不满…

杭电2050(C++)

杭电2050 题目 AC代码 1 #include<stdio.h>2 int main()3 {4 int n, i, sum ;5 while(scanf("%d",&n)!EOF)6 {7 while(n--)8 {9 scanf("%d",&i) ; 10 sum 2*(i*i)-i 1; 11 …

2050 Programming Competition

【1001】开场白 Problem Description 来自世界各地的年青人在 https://2050.org.cn 握手团聚&#xff0c; 他们是航空航天的新生代&#xff0c;编程大赛的优胜者&#xff0c;35岁以下的创新者&#xff0c;科技公司的创始人&#xff0c;展望未来的科学家&#xff0c;天马行空的…