第二十三周代码(跟着罗勇军老师刷题)

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值