2024/03/17 周日
等差数列
【参考代码】
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+1; // 定义常量N为100001
int main()
{
int n;
cin >> n; // 输入等差数列的元素个数n
int a[N]; // 定义数组a,用于存储等差数列的元素
for (int i = 0; i < n; i++)
{
cin >> a[i]; // 输入等差数列的每个元素
}
sort(a, a + n); // 对数组a进行排序
int d = a[1] - a[0]; // 计算公差d,即相邻元素的差值
for (int i = 2; i < n; i++)
{
d = __gcd(d, a[i] - a[i - 1]); // 使用__gcd函数计算公差的最小公约数
}
if (d == 0) // 如果所有元素都相同,则直接输出n
{
cout << n << endl;
return 0;
}
// 计算等差数列中的元素个数:An = A1 + (n-1)*d -> n = [(An - A1) / d] + 1
cout << (a[n - 1] - a[0]) / d + 1 << endl;
return 0;
}
Hankson的趣味题
【参考代码】
//gcd(a,b)∗lcm(a,b)=a∗b
//lcm(a,b)=a∗b/gcd(a,b)会出错,lcm(a,b)=a/gcd(a,b)∗b
#include <bits/stdc++.h>
using namespace std;
// 定义一个函数lcm,用于计算两个数的最小公倍数
int lcm(int number1, int number2)
{
return number1 / __gcd(number1, number2) * number2;
}
int main()
{
int t;
cin >> t; // 输入测试用例的数量
while (t--)
{
int a0, a1, b0, b1;
cin >> a0 >> a1 >> b0 >> b1; // 输入四个整数a0、a1、b0和b1
int result = 0; // 初始化结果变量为0
for (int x = 1; x <= sqrt(b1); x++)
{
if (b1 % x == 0) // 如果x是b1的因子
{
if (a1 == __gcd(x, a0) && b1 == lcm(x, b0)) // 如果满足题目条件
result++; // 结果加1
int y = b1 / x; // 计算另一个因子y
if (x == y) // 如果x和y相等,跳过重复计算
continue;
if (a1 == __gcd(y, a0) && b1 == lcm(y, b0)) // 如果满足题目条件
result++; // 结果加1
}
}
cout << result << endl; // 输出结果
}
return 0;
}
2024/03/18 周一
leetcode 34.在排序数组中查找元素的第一个和最后一个位置
【参考代码】
解法一:不使用算法库函数
注意函数返回类型需要vector<int>
这个代码不能return mid,会输出错误的结果
class Solution {
public:
int binary_search(vector<int>& nums, int target)
{
int l=0, r=(int)nums.size()-1;
while(l <= r)
{
int mid = (l+r) >> 1;
if(nums[mid] < target)
l = mid+1;
else
r = mid-1;
}
return l;
}
vector<int> searchRange(vector<int>& nums, int target) {
int start = binary_search(nums, target);
if(start == nums.size() || nums[start] != target)
return vector<int>{-1, -1};
else
return vector<int>{start, binary_search(nums, target+1)-1};
}
}
解法二:
#include <functional>
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
// 使用lower_bound函数进行二分查找,找到第一个小于等于目标值的元素的位置,并将其存储在变量start中
int start = lower_bound(nums.begin(), nums.end(), target) - nums.begin();
// 使用upper_bound函数进行二分查找,找到第一个大于目标值的元素的位置,并将其存储在变量end中
int end = upper_bound(nums.begin(), nums.end(),target) - nums.begin() - 1;
// 如果start等于向量的大小或者nums[start]不等于目标值,说明目标值不存在于向量中,返回一个包含两个-1的向量
if(start == nums.size() || nums[start] != target)
return vector<int>{-1, -1};
// 否则,返回一个包含start和end的向量,表示目标值在向量中的起始位置和结束位置
else
return vector<int>{start, end};
}
};
是不是简单了不少
洛谷入门题练手STL:P2550 [AHOI2001] 彩票摇奖
【参考代码】
不太优雅的算法,能过
#include <bits/stdc++.h>
using namespace std;
vector<int> WinningNumber(7, 0);
int AwardsNumber[8];
int main()
{
int n;
cin >> n;
for (int i = 0; i < 7; i++)
{
cin >> WinningNumber[i];
}
while (n--)
{
int count = 0;
for (int i = 0; i < 7; i++)//7个数
{
int temporary;
cin >> temporary;
for (int j = 0; j < 7; j++)
{
if(WinningNumber[j] == temporary)
{
count++;
}
}
}
AwardsNumber[count]++;
}
for(int i=7; i>=1; i--)
{
cout << AwardsNumber[i] << ' ';
}
return 0;
}
3个循环不太优雅,减少一个
#include <bits/stdc++.h>
using namespace std;
vector<int> WinningNumber(7, 0);
map<int, int> AwardsNumber;
int main()
{
int n;
cin >> n;
for (int i = 0; i < 7; i++)
{
cin >> WinningNumber[i];
}
while (n--)
{
int count = 0;
for(int i=0; i<7; i++)
{
int temporary;
cin >> temporary;
if(find(WinningNumber.begin(), WinningNumber.end(), temporary) != WinningNumber.end())
{
count++;
}
}
AwardsNumber[count]++;
}
for(int i=7; i>=1; i--)
{
cout << AwardsNumber[i] << ' ';
}
return 0;
}
2024/03/20 周三
java核心技术 实验4 多态与抽象类
详细见顶部资源
2024/03/22 周五
P3367 【模板】并查集
【参考代码】
#include <bits/stdc++.h>
using namespace std;
int f[10001];
int find(int index)
{
if(f[index] == index)
return index;
return f[index] = find(f[index]);
}
int main()
{
int n, m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
f[i] = i;
}
for(int i=0;i<m;i++)
{
int Z, X, Y;
cin>>Z>>X>>Y;
int boss1 = find(X);
int boss2 = find(Y);
if(Z == 1)
{
f[boss1] = boss2;
}
if(Z == 2)
{
if(boss1 == boss2)
cout << 'Y' << endl;
else
cout << "N" << endl;
}
/*
for(int i=1; i<=n; i++)
{
cout << f[i] << ' ';
}
cout << endl;
*/
}
}
/*
4 7
2 1 2
//1 2 3 4
1 1 2
//2 2 3 4
2 1 2
//2 2 3 4
1 3 4
//2 2 4 4
2 1 4
//2 2 4 4
1 2 3
//2 4 4 4
2 1 4
//4 4 4 4 f[boss1] = boss2
*/
最大比例
【参考代码】
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 100;
ll molecule[N], denominator[N], a[N];
ll gcd_sub(ll a,ll b){
if(a<b)
swap(a,b);
if(b==1)
return a;
return gcd_sub(b, a/b);
}
int main(){
int n;
cin>>n;
ll cnt=0;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n); //排序
for(int i=1;i<n;i++){
ll q = __gcd(a[i], a[0]);
molecule[cnt] = a[i]/q;
denominator[cnt] = a[0]/q; //约分,得分子a / 分母b
cnt++;
}
ll up = molecule[0], down = denominator[0];
for(int i=1; i<cnt; i++)
{
up = gcd_sub(up,molecule[i]); //求分子
down = gcd_sub(down, denominator[i]); //求分母
}
cout<< up << '/' << down <<endl;
return 0;
}