杭电oj2000-2099难点记录
- T2028 Lowest Common Multiple Plus——最大公约数
- T2030 汉字识别——汉字内码特性
- T2036 改革春风吹满地——多边形公式
- T2037 今年暑假不AC——区间贪心
- T2047 EOF串——递推求解
- T2048 神、上帝以及老天爷——错排公式
- T2050 折线分割平面
- T2053 Switch Game
- T2057 A + B Again——十六进制直接算数
- T2058 The sum problem——等差数列应用
- T2059 龟兔赛跑——动态规划
- T2063 过山车——二分图最大匹配
- T2064 汉诺塔III——汉诺塔问题
- T2069 Coin Change——背包问题
- T2077 汉诺塔IV——汉诺塔问题
- T2080 夹角有多大II——向量夹角
- T2095 find your present (2)——c语言异或
T2028 Lowest Common Multiple Plus——最大公约数
主要是记录求最大公约数的方法,多个数字的最大公约数就是用遍历不断求两个数的最大公约数
#include <iostream>
using namespace std;
long long lcm(long long x, long long y)
{
long long a = 0, b = 0;
long long temp = 0;
if (x < y)
{
temp = x;
x = y;
y = temp;
}
a = x * y;
while (y != 0)
{
b = x % y;
x = y;
y = b;
}
return a / x;
}
int main()
{
int n;
long long a, b;
while (cin >> n)
{
cin >> a;
for (int i = 0; i < n - 1; i++)
{
cin >> b;
a = lcm(a, b);
}
cout << a << endl;
}
return 0;
}
T2030 汉字识别——汉字内码特性
汉字内码由两个字节组成,且最高位为1
因此可以识别连续的两个字节且为负,即为一个汉字
#include <iostream>
using namespace std;
#include <string>
int main()
{
int n;
cin >> n;
string str;
getline(cin, str);
while (n--)
{
getline(cin, str);
int num = 0;
int flag = 0;
for (int i = 0; i < str.length(); i++)
{
if (str[i] < 0)
flag++;}
else
flag = 0;
if (flag == 2)
{
flag = 0;
num++;
}
}
cout << num << endl;
}
return 0;
}
T2036 改革春风吹满地——多边形公式
多边形公式:0.5*|(x1y2-y1x2)+(x2y3-y2x3)+……+(xny1-ynx1)|
#include <iostream>
using namespace std;
int main()
{
int n;
int x1, y1, xn1, yn1, xn2, yn2;
int sum = 0;
double ans;
while (cin >> n && n)
{
cin >> xn1 >> yn1;
x1 = xn1;
y1 = yn1;
sum = 0;
for (int i = 0; i < n - 1; i++)
{
cin >> xn2 >> yn2;
sum += (xn1*yn2 - yn1 * xn2);
xn1 = xn2;
yn1 = yn2;
}
sum += (xn2*y1 - yn2 * x1);
ans = abs(sum) * 1.0 / 2;
printf("%.1f\n", ans);
}
return 0;
}
T2037 今年暑假不AC——区间贪心
考点是区间贪心,目标是看尽可能多的电视节目
- 对电视节目进行排序
- 首先按照节目开始的时间从大到小排序
- 其次如果节目开始的时间相同,则优先考虑结束时间早的,代表电视节目时间段短,满足看尽可能多电视节目的需求,优先考虑就是在排序的时候将其排到前面
- 这样从第一个开始,往后选择第一个电视节目结束时间在该节目开始时间之前的即可
#include <iostream>
using namespace std;
#include <algorithm>
struct show
{
int start;
int end;
}show[110];
bool cmp(struct show a,struct show b)
{
if (a.start != b.start)
return a.start > b.start;
else
return a.end < b.end;
}
int main()
{
int n;
while (cin >> n && n)
{
for (int i = 0