当前位置: 代码迷 >> 综合 >> 杭电OJ100题——2036-2041(C++版)
  详细解决方案

杭电OJ100题——2036-2041(C++版)

热度:66   发布时间:2023-12-15 13:35:07.0

改革春风吹满地

Problem Description

“ 改革春风吹满地,
不会AC没关系;
实在不行回老家,
还有一亩三分地。
谢谢!(乐队奏乐)”

话说部分学生心态极好,每天就知道游戏,这次考试如此简单的题目,也是云里雾里,而且,还竟然来这么几句打油诗。
好呀,老师的责任就是帮你解决问题,既然想种田,那就分你一块。
这块田位于浙江省温州市苍南县灵溪镇林家铺子村,多边形形状的一块地,原本是linle 的,现在就准备送给你了。不过,任何事情都没有那么简单,你必须首先告诉我这块地到底有多少面积,如果回答正确才能真正得到这块地。
发愁了吧?就是要让你知道,种地也是需要AC知识的!以后还是好好练吧...

 Input

输入数据包含多个测试实例,每个测试实例占一行,每行的开始是一个整数n(3<=n<=100),它表示多边形的边数(当然也是顶点数),然后是按照逆时针顺序给出的n个顶点的坐标(x1, y1, x2, y2... xn, yn),为了简化问题,这里的所有坐标都用整数表示。
输入数据中所有的整数都在32位整数范围内,n=0表示数据的结束,不做处理。

 Output

对于每个测试实例,请输出对应的多边形面积,结果精确到小数点后一位小数。
每个实例的输出占一行。

 Sample Input

3 0 0 1 0 0 1 
4 1 0 0 1 -1 0 0 -1
0

 Sample Output

0.5 
2.0
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;struct Point{int x,y;
}a[100];int main(){int n;while(cin>>n){//共n个点if(n == 0)break;for(int i=0;i<n;i++)cin>>a[i].x>>a[i].y;double ans = 0.0;for(int i = 0; i < n; ++i)ans += a[i].x * a[(i+1)%n].y - a[i].y * a[(i+1)%n].x;cout<<setiosflags(ios::fixed)<<setprecision(1)<<fabs(ans/2.0)<<endl;}return 0;
}

今年暑假不AC

Problem Description

“今年暑假不AC?”
“是的。”
“那你干什么呢?”
“看世界杯呀,笨蛋!”
“@#$%^&*%...”

确实如此,世界杯来了,球迷的节日也来了,估计很多ACMer也会抛开电脑,奔向电视了。
作为球迷,一定想看尽量多的完整的比赛,当然,作为新时代的好青年,你一定还会看一些其它的节目,比如新闻联播(永远不要忘记关心国家大事)、非常6+7、超级女生,以及王小丫的《开心辞典》等等,假设你已经知道了所有你喜欢看的电视节目的转播时间表,你会合理安排吗?(目标是能看尽量多的完整节目)

 Input

输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。

 Output

对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行。

 Sample Input

12

1 3

3 4

0 7

3 8

15 19

15 20

10 15

8 18

6 12

5 10

4 14

2 9

0

 Sample Output

5

#include<iostream>
#include<algorithm>
using namespace std;
//贪心算法
struct program{int startTime;int endTime;//重载'<'bool operator < (const program &A) const{return endTime < A.endTime;}
}a[100];int main(){int n;while(cin>>n){if(n == 0) break;for(int i=0;i<n;i++)cin>>a[i].startTime>>a[i].endTime;sort(a,a+n);//按结束时间升序排序int currentTime = 0,ans = 0;//记录当前时间和节目数for(int i =0;i<n;i++)if(currentTime <= a[i].startTime){currentTime = a[i].endTime;++ans;}cout<<ans<<endl;}
}

三角形

Problem Description

给定三条边,请你判断一下能不能组成一个三角形。

 Input

输入数据第一行包含一个数M,接下有M行,每行一个实例,包含三个正数A,B,C。其中A,B,C <1000;

 Output

对于每个测试实例,如果三条边长A,B,C能组成三角形的话,输出YES,否则NO。

 Sample Input

2 
1 2 3 
2 2 2

 Sample Output

NO 
YES
#include<iostream>
using namespace std;int main(){int n;cin>>n;while(n--){double edge1,edge2,edge3;cin>>edge1>>edge2>>edge3;if(edge1+edge2>edge3&&edge1+edge3>edge2&&edge3+edge2>edge1)cout<<"YES"<<endl;elsecout<<"NO"<<endl;}
}

亲和数

Problem Description


古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为: 

1+2+4+5+10+11+20+22+44+55+110=284。 

而284的所有真约数为1、2、4、71、 142,加起来恰好为220。人们对这样的数感到很惊奇,并称之为亲和数。一般地讲,如果两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。 

你的任务就编写一个程序,判断给定的两个数是否是亲和数

 Input

输入数据第一行包含一个数M,接下有M行,每行一个实例,包含两个整数A,B; 其中 0 <= A,B <= 600000 ;

 Output

对于每个测试实例,如果A和B是亲和数的话输出YES,否则输出NO。

 Sample Input

2 
220 284 
100 200

 Sample Output

YES 
NO
#include<iostream>
using namespace std;int main(){int n;cin>>n;while(n--){//存两个亲和数int num1,num2;//存因数的和int a_sum = 0,b_sum = 0;cin>>num1>>num2;for(int i=1;i <= num1/2;i++)if(num1%i == 0)a_sum += i;for(int i=1;i <= num2/2;i++)if(num2%i == 0)b_sum += i;if(a_sum == num2 && b_sum == num1)cout<<"YES"<<endl;elsecout<<"NO"<<endl;}return 0;
}

超级楼梯

Problem Description

有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?

 Input

输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1<=M<=40),表示楼梯的级数。

 Output

对于每个测试实例,请输出不同走法的数量

 Sample Input

2 
2 
3

Sample Output

1 
2
#include<iostream>
using namespace std;
//斐波那契数列
int main(){int n;cin>>n;while(n--){int arr[40];arr[0] = 0;arr[1] = 1;arr[2] = 1;for(int i=3;i<=40;i++)arr[i] = arr[i-1]+arr[i-2];int m;cin>>m;cout<<arr[m]<<endl;}return 0;
}