杭电2035.人见人爱A^B
原题链接Problem - 2035
题目描述
Problem Description求A^B的最后三位数表示的整数。说明:A^B的含义是“A的B次方”
Input:输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组和(1<=A,B<=10000),如果A=0, B=0,则表示输入数据的结束,不做处理。
Output:对于每个测试实例,请输出A^B的最后三位表示的整数,每个输出占一行。
运行代码
#include<iostream>
#define ll long long
using namespace std;
#include<cmath>
ll power(ll A, ll B) {
long long res = 1;
A %= 1000;
while (B > 0) {
if (B % 2 == 1) {
res = (res * A) % 1000;
}
B /= 2;
A = (A * A) % 1000;
}
return (res + 1000) % 1000;
}
int main() {
int a, b,c;
while (cin >> a >> b && (!(a == 0 && b == 0))) {
c = power(a, b);
cout << c << endl;
}
}
代码思路
为了计算 A^B的最后三位数,我们只需要关注指数运算的结果模 1000 的值,因为任何数除以 1000的余数就代表了该数的最后三位数。这种方法可以极大地减少计算量,特别是当 B很大时。首先定义了一个 power
函数,该函数使用快速幂算法计算 A^B mod1000。在主循环中,程序读取每一对整数 A和 B,当 A 和 B 都为0时停止读取并结束程序。对于每一对有效的输入,它调用 power
函数并输出结果的最后三位数。注意,由于我们只关心模1000的结果,所以在计算过程中始终保持结果的大小在模1000之下,避免了大整数运算的复杂度。
杭电2036.改革东风吹满地
原题链接:Problem - 2036
题目描述
Problem Description
“ 改革春风吹满地,
不会AC没关系;
实在不行回老家,
还有一亩三分地。
谢谢!(乐队奏乐)”
话说部分学生心态极好,每天就知道游戏,这次考试如此简单的题目,也是云里雾里,而且,还竟然来这么几句打油诗。
好呀,老师的责任就是帮你解决问题,既然想种田,那就分你一块。
这块田位于浙江省温州市苍南县灵溪镇林家铺子村,多边形形状的一块地,原本是linle 的,现在就准备送给你了。不过,任何事情都没有那么简单,你必须首先告诉我这块地到底有多少面积,如果回答正确才能真正得到这块地。
发愁了吧?就是要让你知道,种地也是需要AC知识的!以后还是好好练吧...
Input:输入数据包含多个测试实例,每个测试实例占一行,每行的开始是一个整数n(3<=n<=100),它表示多边形的边数(当然也是顶点数),然后是按照逆时针顺序给出的n个顶点的坐标(x1, y1, x2, y2... xn, yn),为了简化问题,这里的所有坐标都用整数表示。
输入数据中所有的整数都在32位整数范围内,n=0表示数据的结束,不做处理。
Output:对于每个测试实例,请输出对应的多边形面积,结果精确到小数点后一位小数。
每个实例的输出占一行。
运行代码
#include <iostream>
#include <cmath>
#include<iomanip>
const int N = 100;
using namespace std;
// 计算叉积
double Product(double x1, double y1, double x2, double y2) {
return x1 * y2 - x2 * y1;
}
// 计算多边形面积
double poly(int n, double* x, double* y) {
double area = 0;
for (int i = 0; i < n; i++) {
area += Product(x[i], y[i], x[(i + 1) % n], y[(i + 1) % n]);
}
return abs(area) / 2.0;
}
int main() {
int n;
while (cin >> n && n!= 0) {
double x[N], y[N];
for (int i = 0; i < n; i++) {
cin >> x[i] >> y[i];
}
cout << fixed << setprecision(1) << poly(n, x, y) << endl;
}
return 0;
}
代码思路
Product
函数用于计算两个向量的叉积。poly
函数通过遍历多边形的各个顶点,将相邻顶点构成的向量进行叉积计算,并将所有叉积结果累加。最后取绝对值并除以 2 得到多边形的面积。- 在
main
函数中,不断读取测试实例的顶点数n
和各个顶点坐标。然后调用poly
函数计算并输出面积,通过设置输出格式精确到小数点后一位。
计算多边形面积的原理是利用向量叉积来逐步累加对多边形区域的贡献。通过这种方式可以有效地处理各种不同形状的多边形面积计算问题。
杭电2037.今年暑假不AC
原题链接Problem - 2037
题目描述
“今年暑假不AC?”
“是的。”
“那你干什么呢?”
“看世界杯呀,笨蛋!”
“@#$%^&*%...”
确实如此,世界杯来了,球迷的节日也来了,估计很多ACMer也会抛开电脑,奔向电视了。
作为球迷,一定想看尽量多的完整的比赛,当然,作为新时代的好青年,你一定还会看一些其它的节目,比如新闻联播(永远不要忘记关心国家大事)、非常6+7、超级女生,以及王小丫的《开心辞典》等等,假设你已经知道了所有你喜欢看的电视节目的转播时间表,你会合理安排吗?(目标是能看尽量多的完整节目)
Input:输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。
Output:对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行。
运行代码
使用结构体
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct FN {
int start;
int end;
};
bool compare(FN p1, FN p2) {
return p1.end < p2.end;
}
int main() {
int n;
while (cin >> n && n != 0) {
vector<FN> fn(n);
for (int i = 0; i < n; i++) {
cin >> fn[i].start >> fn[i].end;
}
sort(fn.begin(), fn.end(), compare);
int count = 0;
int lastEnd = 0;
for (FN p : fn) {
if (p.start >= lastEnd) {
count++;
lastEnd = p.end;
}
}
cout << count << endl;
}
return 0;
}
代码思路
- 定义了一个结构体
FN
来表示节目,包含开始时间start
和结束时间end
。 compare
函数用于比较两个结构体实例,根据结束时间从小到大排序。- 在
main
函数中:- 不断接收测试实例的节目数量
n
,当n
不为 0 时进行处理。 - 创建一个包含
n
个FN
结构体的向量fn
,并输入每个节目的开始和结束时间。 - 通过自定义的比较函数
compare
对向量进行排序。 - 然后通过遍历排序后的向量,统计能够完整观看的节目数量。如果当前节目开始时间大于等于上一个节目结束时间,就将计数加 1,并更新上一个节目结束时间为当前节目结束时间。最后输出统计的节目数量。
- 不断接收测试实例的节目数量