2026.03.25(第一天)

练习题

1

答案

cpp 复制代码
#include <stdio.h>
int main() {
    int m;
    scanf("%d", &m);
    int k = 2;
    while (k <= m && (m % k))
        /************found************/
        k++;
        /************found************/
    if (m == k )
        printf("YES\n");
    else
        printf("NO\n");
    return 0;
}

注意事项

  • 注意/found/下面才是需要修改的行。
  • 注意错误也可能是符号之类的,不一定是思路。

11

答案

cpp 复制代码
#include <stdio.h>

#define SIZE 100

int main() {

	double s[SIZE], w[SIZE / 5];

	int i, k, n;

    double sum;

	scanf("%d", &n);

	for (k = 2, i = 0; i < n; i++) {

		s[i] = k;

		/**********found**********/

		k+=2;

	}

	sum = 0.0;

	for (k = 0, i = 0; i < n; i++) {

		sum += s[i];

		/**********found**********/

		if ((i+1)%5 == 0) {

			w[k] = sum / 5;

			/**********found**********/

			sum=0;

			k++;

		}

	}

	for (i = 0; i < k; i++)

		printf("%6.2f ", w[i]);

	return 0;

}

注意事项

  • 注意填空的时候观察变量的具体变化。

21

答案

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
//将一个正整数N(1<N<32768)分解质因数。例如,输入90,打印出90=2*3*3*5。
int main(){
	int N;
	cin>>N;
	cout<<N<<"=";
	bool first=true;
	for(int i=2;i*i<=N;i++){
		while(N%i==0){
			if(!first){
				cout<<"*";
			}
			first=false;
			cout<<i;
			N/=i;
		}
	}
	if(N>1){//刚好除尽则剩余1
		if(!first){
			cout<<"*";
		}
		first=false;
		cout<<N;
	}
	cout<<endl;
	return 0;
}

注意事项

  • 注意这里使用的是N/=i;进行循环,那么最后正好整除的话N==1。

31

答案

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
//对于一给定的素数集合 S = {p1, p2, ..., pK}, 来考虑那些质因数全部属于S 的数的集合。
//这个集合包括,p1, p1p2(即p1乘以p2), p1p3, 和 p1p2p3 (还有其它很多)。
//这是个对于一个集合S的丑数集合。注意:我们不认为1 是一个丑数。
//你的工作是对于输入的集合S去寻找集合中的第N个丑数。
//说明:结果不超过32位整数能表示的范围
//比如:S={2, 3, 5, 7}
//则前15个丑数为:
//2,3,4,5,6,7,8,9,10,12,14,15,16,18,20

int main(){
	int K,N;
	cin>>K>>N;
	vector<int> S(K);
	vector<int> Idx(K,0);
	vector<int> Ans;
	for(int i=0;i<K;i++){
		cin>>S[i];
	}
	Ans.push_back(1);
	for(int i=1;i<=N;i++){
		int min=INT_MAX;
		for(int j=0;j<K;j++){
			int t=Ans[Idx[j]]*S[j];
			if(t<min){
				min=t;
			}
		}
		Ans.push_back(min);
		for(int j=0;j<K;j++){
			if(Ans[Idx[j]]*S[j]==min){
				Idx[j]++;
			}
		}
	}
	cout<<Ans[N]<<endl;
	return 0;
}

注意事项

  • 注意这题不能暴力枚举,会超时。
  • 这题主要是进行索引的变化,只需要每次比较出能乘质数数组出最小的Ans数组中的值,将这个对应的数往后排。
bash 复制代码
示例演示
输入
4 15
2 3 5 7

意思是:

K = 4,有 4 个素数
N = 15,求第 15 个丑数
素数集合:
𝑆
=
{
2
,
3
,
5
,
7
}
S={2,3,5,7}
我们用到的数组
1)素数数组 p[]
p = [2, 3, 5, 7]
2)丑数数组 a[]

a[i] 表示第 i 个丑数。

注意:

a[0] = 1

这里的 1 只是辅助起点,不算丑数。

所以真正的第 1 个丑数是以后生成出来的 a[1]。

3)指针数组 idx[]
idx = [0, 0, 0, 0]

它表示:

2 现在乘 a[0]
3 现在乘 a[0]
5 现在乘 a[0]
7 现在乘 a[0]

也就是一开始都从 1 开始乘。

初始状态
a[0] = 1
idx = [0, 0, 0, 0]
第 1 轮:求第 1 个丑数

当前候选值:

2 × a[0] = 2 × 1 = 2
3 × a[0] = 3 × 1 = 3
5 × a[0] = 5 × 1 = 5
7 × a[0] = 7 × 1 = 7

最小值是:

2

所以:

a[1] = 2
谁生成了 2?

只有:

2 × a[0]

所以把 2 对应的指针后移:

idx = [1, 0, 0, 0]
第 2 轮:求第 2 个丑数

当前候选值:

2 × a[1] = 2 × 2 = 4
3 × a[0] = 3 × 1 = 3
5 × a[0] = 5 × 1 = 5
7 × a[0] = 7 × 1 = 7

最小值是:

3

所以:

a[2] = 3
谁生成了 3?

只有:

3 × a[0]

所以:

idx = [1, 1, 0, 0]
第 3 轮:求第 3 个丑数

当前候选值:

2 × a[1] = 4
3 × a[1] = 6
5 × a[0] = 5
7 × a[0] = 7

最小值:

4

所以:

a[3] = 4
谁生成了 4?

只有:

2 × a[1]

所以:

idx = [2, 1, 0, 0]

41

答案

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

int main(){
	int k,N;
	cin>>k>>N;
	vector<int> Ans;
	int t=1;
	while(Ans.size()<N){
		Ans.push_back(t);
		int s=Ans.size()-1;
		for(int j=0;j<s;j++){//注意Ans.size()一直在变化
			Ans.push_back(t+Ans[j]);
		}
		
		t*=k;
	}
	cout<<Ans[N-1]<<endl;
	return 0;
	
}

注意事项

  • 注意Ans.size()一直在变化。
  • 注意循环中的顺序问题。

51

答案

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
/*有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:

  每个小朋友都把自己的糖果分一半给左手边的孩子。

  一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。

  反复进行这个游戏,直到所有小朋友的糖果数都相同为止。

  你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。*/
int main(){
	int N;
	cin>>N;
	vector<int> Kid(N);
	for(int i=0;i<N;i++){
		cin>>Kid[i];
	}
	bool equal=false;
	int ans=0;
	while(!equal){
		for(int i=0;i<N;i++){
			if(Kid[i]%2!=0){
				Kid[i]++;
				ans++;
			}
		}
		vector<int> half(N,0);
		for(int i=0;i<N;i++){
			half[i]=Kid[i]/2;
		}
		for(int i=0;i<N;i++){
			Kid[i]=half[i]+half[(i+N-1)%N];
		}
		int eq=Kid[0];
		bool equ=true;
		for(int i=1;i<N;i++){
			if(eq!=Kid[i]){
				equ=false;
				break;
			}
		}
		if(equ){
			equal=true;
		}
	}
	cout<<ans<<endl;
	return 0;
}

注意事项

  • 注意每次取一半的时候需要单独存储。

英语翻译

  • 近几年大约模型已经在人工智能领域成为了一个重要的研究方向,这些模型通常以Transformer架构为基础,并且通过大量的文本数据及进行训练。通过学习语言中的数据模式,大语言模型能够执行多样的任务,例如文本生成问题回答以及机器翻译。随着模型尺寸持续的增加,大语言模型在许多自然语言处理任务中已经可以表现的接近或者甚至超过人类的水平。然而训练和部署这样巨大的模型要求巨大的计算资源,这导致了有关能源消耗和成本的担忧,因此提升模型性能已经成为了一个重要的研究要点。

单词打卡

相关推荐
cpp_25013 小时前
P1968 [CHCI 2001 Regional Competition Seniors] 美元汇率
数据结构·c++·算法·题解·洛谷·线性dp
博界IT精灵3 小时前
树的概念与性质(哈喜老师)
数据结构
小此方3 小时前
Re:从零开始的 C++ STL篇(八)深度解构AVL树自平衡机制:平衡维护与旋转调整背后的严密逻辑
开发语言·数据结构·c++·算法·stl
2301_789015623 小时前
封装哈希表实现unordered_set/undered_map
c语言·数据结构·c++·算法·哈希算法
独断万古他化3 小时前
【算法通关】递归:汉诺塔、合并链表、反转链表、两两交换、快速幂全解
数据结构·算法·链表·递归
ccLianLian16 小时前
数论·约数
数据结构·算法
会编程的土豆16 小时前
【数据结构与算法】最短路径---Dijkstra 算法
数据结构·c++·算法
计算机安禾17 小时前
【数据结构与算法】第3篇:C语言核心机制回顾(二):动态内存管理与typedef
c语言·开发语言·数据结构·c++·算法·链表·visual studio
励志的小陈18 小时前
数据结构---顺序表
数据结构