3.27完成3(指针)、13、41、44(指针)、50、51、95、96、97

题目:

给定程序中函数fun的功能是:将字符串中的字符按逆序输出,但不改变字符串中的内容。

例如,若字符串为abcd,则应输出:dcba。

请改正程序中的错误,使它能计算出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!

#include <stdio.h>

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

fun (char a) {

if (*a) {

fun(a + 1);

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

printf("%c" *a);

}

}

int main() {

char s[100] = {0};

gets(s);

fun(s);

return 0;

}

要点总结:

指针可以通过加一向后移动

代码:

#include <stdio.h>

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

void fun (char *a) {

if (*a) {

fun(a + 1);

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

printf("%c", *a);

}

}

int main() {

char s[100] = {0};

gets(s);

fun(s);

return 0;

}

题目:

给定程序的功能是建立一个n*n的矩阵。 矩阵元素的构成规律是:

最外层元素的值全部为1;从外向内第2层元素的值全部为2;第3层元素的值全部为3,依次类推。例如,若n=5,生成的矩阵为:

1 1 1 1 1

1 2 2 2 1

1 2 3 2 1

1 2 2 2 1

1 1 1 1 1

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序如下。不得增行或删行,也不得更改程序的结构!

#include <stdio.h>

#define N 15

int main() {

int a[N][N] = {0}, i, j, k, m, n;

scanf("%d", &n);

if (n % 2 == 0)

m = n / 2 ;

else

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

m = 1;

for (i = 0; i < m; i++) {

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

for (j = 2 ; j < n - i; j++)

a[i][j] = a[n - i - 1][j] = i + 1;

for (k = i + 1; k < n - i; k++)

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

a[k][i] = a[k][n - i - 1] = 3;

}

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

for (j = 0; j < n; j++)

printf("%3d", a[i][j]);

printf("\n");

}

return 0;

}

要点总结:

直接记一下,一个是i一个是i+1,还有一个是n/2要么加一或者减一,想不起来就都试一下。

代码:

#include <stdio.h>

#define N 15

int main() {

int a[N][N] = {0}, i, j, k, m, n;

scanf("%d", &n);

if (n % 2 == 0)

m = n / 2 ;

else

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

m = n/2+1;

for (i = 0; i < m; i++) {

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

for (j = i; j < n - i; j++)

a[i][j] = a[n - i - 1][j] = i + 1;

for (k = i + 1; k < n - i; k++)

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

a[k][i] = a[k][n - i - 1] = i+1;

}

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

for (j = 0; j < n; j++)

printf("%3d", a[i][j]);

printf("\n");

}

return 0;

}

题目:

给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是:

1,3,4,9,10,12,13,...

(该序列实际上就是:30,31,30+31,32,30+32,31+32,30+31+32,...)

请你求出这个序列的第N项的值(用10进制数表示)。

例如,对于k=3,N=100,正确答案应该是981。

要点总结:

此题等价于把对应的数字先转化为二进制数,然后再转换回k进制数字。记得char转int,并且使用pow函数。

代码:

#include<bits/stdc++.h>

using namespace std;

int main(){

int k,n;

cin>>k>>n;

string erjin="";

int temp=n;

while(temp>0){

int cur=temp%2;

erjin=to_string(cur)+erjin;

temp/=2;

}

long long res=0;

for(int i=erjin.size()-1;i>=0;i--){

int cifang=erjin.size()-i-1;

res=res+(erjin[i]-'0')*pow(k,cifang);

}

cout<<res;

return 0;

}

题目:

在一个有限的正整数序列中,有些数会多次重复出现在这个序列中。

如序列:3,1,2,1,5,1,2。其中1就出现3次,2出现2次,3出现1 次,5出现1次。

你的任务是对于给定的正整数序列,从小到大依次输出序列中出现的数及出现的次数。

要点总结:

记住,map的迭代器去访问first和second时要用指针,别想不起来语法。

代码:

#include<bits/stdc++.h>

using namespace std;

int main(){

int n;

cin>>n;

map<int,int> rec;

int maxnum=INT_MIN;

for(int i=0;i<n;i++){

int num;

cin>>num;

maxnum=max(maxnum,num);

rec[num]++;

}

for(int i=1;i<=maxnum;i++){

if(rec.find(i)!=rec.end()){

auto x=rec.find(i);

cout<<x->first<<" "<<x->second<<endl;

}

}

return 0;

}

题目:

小明正在玩一个"翻硬币"的游戏。

桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。

比如,可能情形是:**oo***oooo

如果同时翻转左边的两个硬币,则变为:oooo***oooo

现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?

我们约定:把翻动相邻的两个硬币叫做一步操作

要点总结:

此题基于贪心思路,从左往右扫,只要是不是终态的就翻两个,因为这一路都是必要翻的,不会有冗余操作。

代码:

#include<bits/stdc++.h>

using namespace std;

void tran(char &a){

if(a=='o') a='*';

if(a=='*') a='o';

}

int main(){

string a,b;

cin>>a>>b;

int num=0;

for(int i=0;i<=a.size()-2;i++){

if(a[i]!=b[i]){

tran(a[i]);

tran(a[i+1]);

num++;

}

}

cout<<num;

return 0;

}

题目:

有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:

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

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

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

你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。

要点总结:

记忆一下,如果从后往前向循环队列那样绕着圈走需要先加n,其他一样,否则有负值。另外,这里把最后一个单独处理一下,不然会污染。

代码:

#include<bits/stdc++.h>

using namespace std;

bool isequal(vector<int> arr){

int base=arr[0];

for(int i=1;i<arr.size();i++){

if(base!=arr[i]) return false;

}

return true;

}

int main(){

int n;

cin>>n;

int num=0;

vector<int> arr(n);

for(int i=0;i<n;i++){

cin>>arr[i];

}

while(!isequal(arr)){

int a=arr[n-1];

for(int i=0;i<n-1;i++){

int front=(i-1+n)%n;

int fen=arr[i]/2;

arr[front]+=fen;

arr[i]-=fen;

}

arr[n-2]+=a/2;

arr[n-1]-=a/2;

for(int i=0;i<n;i++){

if(arr[i]%2==1){

arr[i]++;

num++;

}

}

}

cout<<num;

return 0;

}

题目:

将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。

例如:n=7,k=3,下面三种分法被认为是相同的。

1,1,5; 1,5,1; 5,1,1;

问有多少种不同的分法。

样例输入

7 3

样例输出

4 {四种分法为:1,1,5; 1,2,4; 1,3,3; 2,2,3;}

要点总结:

dp[i][j] 表示将整数 i 拆分成 j 份的方案数,首先所有拆成一份的方案数都是1,然后先遍历所有方案书,再遍历所有数字,累加过程分两种情况:一种拆了1出去,一种一个1都没拆出去。这里和后面那个拆解的题目难的那种情况都是一个i-j一个j

代码:

#include<bits/stdc++.h>

using namespace std;

int main(){

int n,k;

cin>>n>>k;

vector<vector<int>> dp(n+1,vector<int>(k+1));

for(int i=1;i<=n;i++){

dp[i][1]=1;

}

for(int j=2;j<=k;j++){

for(int i=j;i<=n;i++){

dp[i][j]+=dp[i-1][j-1];

dp[i][j]+=dp[i-j][j];

}

}

cout<<dp[n][k];

return 0;

}

题目:

上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。

游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师再次吹哨子时,传球停止,此时,拿着球没传出去的那个同学就是败者,要给大家表演一个节目。

聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了m次以后,又回到小蛮手里。两种传球的方法被视作不同的方法,当且仅当这两种方法中,接到球的同学按接球顺序组成的序列是不同的。比如有3个同学1号、2号、3号,并假设小蛮为1号,球传了3次回到小蛮手里的方式有1->2->3->1和1->3->2->1,共2种。

要点总结:

dp的行表示传几次球,列表示传到谁手上,起初传0次就到1号手上。,之后遍历所有情况,每次的值可以从左边传过来也可以从右边传过来,直接相加即可。

#include<bits/stdc++.h>

using namespace std;

int main(){

int n,m;

cin>>n>>m;

vector<vector<int>> dp(m+1,vector<int>(n+1,0));

dp[0][1]=1;

for(int i=1;i<=m;i++){

for(int j=1;j<=n;j++){

int left=j-1==0? n : j-1;

int right=j+1==n+1? 1 : j+1;

dp[i][j]=dp[i-1][left]+dp[i-1][right];

}

}

cout<<dp[m][1];

return 0;

}

题目:

一个正整数可以划分为多个正整数的和,比如n=3时:

3;1+2;1+1+1;

共有三种划分方法。

给出一个正整数,问有多少种划分方法。

要点总结:

dp[i][j] 表示将整数 i 划分为若干个不超过 j 的正整数之和的方案数,0的划分数都是1,后面遍历所有情况,一种情况最大划分数比i大,那只能用i到i的,另一种情况的话分为用j和不用j两种情况。

代码:

#include<bits/stdc++.h>

using namespace std;

int main(){

int n;

cin>>n;

vector<vector<int>> dp(n+1,vector<int>(n+1,0));

for(int j=0;j<=n;j++){

dp[0][j]=1;

}

for(int i=1;i<=n;i++){

for(int j=1;j<=n;j++){

if(j>i){

dp[i][j]=dp[i][i];

}else{

dp[i][j]=dp[i][j-1]+dp[i-j][j];

}

}

}

cout<<dp[n][n];

return 0;

}

英语翻译:

生成式人工智能指的是可以产生和训练数据相似的新数据的模型。目前流行的生成式模型有生成对抗网络以及扩散模型。这些模型以及被广泛应用于图像合成、文本生成以及音频创造。在生成对抗网络的架构中,生成器和辨别器彼此对抗以提升生成数据的质量。另一方面,扩散模型通过将随即输入数据中的噪声逐渐移除来生成数据。生成式人工智能技术已经在很多领域展现出了巨大潜力,例如内容创作、药品研发以及虚拟现实。然而,生成式人工智能技术同样引起了人们关于不实信息散步以及数据隐私问题的伦理道德担忧,这需要仔细的监管。

相关推荐
AI成长日志2 小时前
【强化学习专栏】深度强化学习技术演进:DQN、PPO、SAC的架构设计与训练优化
人工智能·算法·架构
郭逍遥2 小时前
[Godot] JPS跳点寻路和RVO避障
算法·godot·启发式算法
rgb2gray2 小时前
论文详解:基于POI数据的城市功能区动态演化分析——以北京为例
人工智能·算法·机器学习·回归·gwr
m0_734998012 小时前
Day 26
数据结构·c++·算法
信奥卷王2 小时前
2026年03月GESPC++二级真题解析(含视频)
算法
从零开始学习人工智能2 小时前
国产阿特拉斯无人机蜂群核心算法(一)
算法·无人机
励志的小陈3 小时前
双指针算法--移除元素、删除有序数组中的重复项、合并两个有序数组
算法
hoiii1873 小时前
Mean Shift目标跟踪算法MATLAB实现
算法·matlab·目标跟踪
励志的小陈3 小时前
复杂度算法题——旋转数组(三种思路)
c语言·数据结构·算法