蓝桥杯练习系统心得

蓝桥杯VIP题目免费提交,内含超详解,步步截图!!! 很良心了~~ 阅读详情
1.
问题描述

Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。

当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。

输入格式
输入包含一个整数n。
输出格式
输出一行,包含一个整数,表示Fn除以10007的余数。

说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。

样例输入
10
样例输出
55
样例输入
22
样例输出
7704
数据规模与约定

1 <= n <= 1,000,000。


答案:

#include <stdlib.h> 

#include <stdio.h> 
#define MOD 10007 
#define MAXN 1000001 
int n, i, F[MAXN]; 
int main() 
{ 
scanf("%d", &n);
F[1] = 1; 
F[2] = 1; 
for (i = 3; i <= n; ++i) 
F[i] = (F[i-1] + F[i-2]) % MOD; 
printf("%d\n", F[n]); 
return 0; 
}


2

问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
  输出n行,每行为输入对应的八进制正整数。
注意
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
提示
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。



错误答案:

#include<iostream>
using namespace std;
#include <algorithm>
#include <string>
#include <math.h>
//#include<vector>


int main()
{
<span style="white-space:pre">	</span>//vector<int> x;
<span style="white-space:pre">	</span>int a[10][100];
<span style="white-space:pre">	</span>int k = 0;
<span style="white-space:pre">	</span>string s;
<span style="white-space:pre">	</span>int n;
<span style="white-space:pre">	</span>int sum=0;
<span style="white-space:pre">	</span>cin >> n;
<span style="white-space:pre">	</span>while (k<n)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>cin >> s;
<span style="white-space:pre">		</span>for (int i = 0; i < s.length(); i++)
<span style="white-space:pre">		</span>{
<span style="white-space:pre">			</span>if (s[i] >= '0'&&s[i] <= '9')
<span style="white-space:pre">			</span>{
<span style="white-space:pre">				</span>sum += (s[i] - '0')*pow(16, s.length()-1- i);
<span style="white-space:pre">			</span>}
<span style="white-space:pre">			</span>else
<span style="white-space:pre">			</span>{
<span style="white-space:pre">				</span>sum += (s[i] - 'A' + 10)*pow(16, s.length() -1 - i);
<span style="white-space:pre">			</span>}
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>//cout << sum<<endl;
<span style="white-space:pre">		</span>int j = 1;
<span style="white-space:pre">		</span>while (sum!=0)
<span style="white-space:pre">		</span>{
<span style="white-space:pre">			</span>a[k][j] = sum % 8;
<span style="white-space:pre">			</span>sum = sum / 8;
<span style="white-space:pre">			</span>j++;
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>a[k][0] = j-1;
<span style="white-space:pre">		</span>k++;
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>for (int j = 0; j < k; j++)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>for (int i = a[j][0]; i >0; i--)
<span style="white-space:pre">		</span>{
<span style="white-space:pre">			</span>cout << a[j][i];
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>cout << endl;
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>return 0;
}


正确答案:

// 十六进制转换8进制 AC

#include <iostream>
#include <string>
using namespace std;
int arr[10000001];

int main()
{
  int n,len_str,i,j;
  string str,str2;
  cin>>n;
  while(n--)
  {
    cin>>str;
    len_str=str.length();
    str2="";

    // 十六进制转换为二进制
    for(i=0;i<len_str;++i)
    {
      switch(str[i])
      {
      case '0':str2+="0000";break;
      case '1':str2+="0001";break;
      case '2':str2+="0010";break;
      case '3':str2+="0011";break;
      case '4':str2+="0100";break;
      case '5':str2+="0101";break;
      case '6':str2+="0110";break;
      case '7':str2+="0111";break;
      case '8':str2+="1000";break;
      case '9':str2+="1001";break;
      case 'A':str2+="1010";break;
      case 'B':str2+="1011";break;
      case 'C':str2+="1100";break;
      case 'D':str2+="1101";break;
      case 'E':str2+="1110";break;
      case 'F':str2+="1111";break;
      default:break;
      }
    }
    
    // 修正位数
    if(len_str%3==1)	str2="00"+str2;
    
    else if(len_str%3==2)	str2="0"+str2;

    
    len_str=str2.length();
    // 二进制转换八进制
    j=0;
    for(i=0;i<=len_str-2;i+=3)
    {
      arr[j]=(str2[i]-'0')*4+(str2[i+1]-'0')*2+(str2[i+2]-'0');
      ++j;
    }

    for(i=0;i<j;++i)
    {
      if(i==0 && arr[i]==0)	continue;
      cout<<arr[i];
    }
    cout<<endl;

  }
  return 0;
}

3.

问题描述
  123321是一个非常特殊的数,它从左边读和从右边读是一样的。
  输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
输入格式
  输入一行,包含一个正整数n。
输出格式
  按从小到大的顺序输出满足条件的整数,每个整数占一行。
样例输入
52
样例输出
899998
989989
998899
数据规模和约定
  1<=n<=54。

答案:
#include<iostream>
using namespace std;
//#include <algorithm>
#include <string>
#include <math.h>
//#include<vector>

int main()
{
	int n;
	int a[6];
	cin>>n;
	for(int i=10001;i<=99999;++i)
	{
		a[4]=i/10000;
		a[3]=(i/1000)%10;
		a[2]=(i/100)%10;
		a[1]=(i/10)%10;
		a[0]=i%10;
		if(a[0]==a[4]&&a[1]==a[3]&&a[0]+a[1]+a[2]+a[3]+a[4]==n)
		{
			cout<<i<<endl;
		}
	}
	for(int i=100001;i<=999999;++i)
	{
		a[5]=i/100000;
		a[4]=(i/10000)%10;
		a[3]=(i/1000)%10;
		a[2]=(i/100)%10;
		a[1]=(i/10)%10;
		a[0]=i%10;
		if(a[0]==a[5]&&a[1]==a[4]&&a[2]==a[3]&&a[0]+a[1]+a[2]+a[3]+a[4]+a[5]==n)
		{
			cout<<i<<endl;
		}
	}
	return 0;
}
心得:蓝桥杯多用暴力破解法

4
问题描述

利用字母可以组成一些美丽的图形,下面给出了一个例子:

ABCDEFG

BABCDEF

CBABCDE

DCBABCD

EDCBABC

这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。

输入格式
输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。
输出格式
输出n行,每个m个字符,为你的图形。
样例输入
5 7
样例输出
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
数据规模与约定
1 <= n, m <= 26。
AC
#include<iostream>
using namespace std;
#include<algorithm>
#include<list>
#include<string>

void show(list<char> l,int m)
{
	list<char>::iterator itr = l.begin();
	int i = 0;
	while (itr != l.end()&&i<m)
	{
		cout << *itr;
		itr++;
		i++;
	}
	cout << endl;
}

int main()
{
	string s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	list<char> l;
	int n, m;
	cin >> n >> m;
	l.assign(s.begin(), s.begin() + m);
	
	show(l,m);
	for (int i = 1; i < n; i++)
	{
		l.push_front('A' + i);
		show(l,m);
	}
	return 0;
}

心得:STL模板的应用以及对规律的观察


5
问题描述

给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。

输入格式

第一行包含一个数n,表示序列长度。

第二行包含n个正整数,表示给定的序列。

第三个包含一个正整数m,表示询问个数。

接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个。序列元素从1开始标号。

输出格式
总共输出m行,每行一个数,表示询问的答案。
样例输入
5
1 2 3 4 5
2
1 5 2
2 3 2
样例输出
4
2
数据规模与约定

对于30%的数据,n,m<=100;

对于100%的数据,n,m<=1000;

保证k<=(r-l+1),序列中的数<=106。

#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>
//#include<list>
//#include<string>


int main()
{
	vector <int> v;
	int n,b;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> b;
		v.push_back(b);
	}
	int x;
	cin >> x;
	while (x--)
	{
		int begin,end,a;
		cin >> begin >> end >> a;
		vector<int> copy;
		copy.assign(v.begin()+begin-1, v.begin()+end);
		sort(copy.begin(), copy.end());
		reverse(copy.begin(), copy.end());
		cout << copy.at(a - 1);
	}
	return 0;
}
心得:依旧是STL的应用,另外end不用+1的原因是end不包括在copy中

6
问题描述

如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数。求L位K进制数中K好数的数目。例如K = 4,L = 2的时候,所有K好数为11、13、20、22、30、31、33 共7个。由于这个数目很大,请你输出它对1000000007取模后的值。

输入格式

输入包含两个正整数,K和L。

输出格式
输出一个整数,表示答案对1000000007取模后的值。
样例输入
4 2
样例输出
7
数据规模与约定

对于30%的数据,KL <= 106;

对于50%的数据,K <= 16, L <= 10;

对于100%的数据,1 <= K,L <= 100。

AC
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define mod 1000000007
__int64 dp[105][105];

int main()
{
    int k,l,i,j,x;
    scanf("%d%d",&k,&l);
    for(i = 0; i<k; i++)
        dp[1][i] = 1;
    for(i = 2; i<=l; i++)
        for(j = 0; j<k; j++)
            for(x = 0; x<k; x++)
                if(x!=j-1&&x!=j+1)//根据题意,本位的数字与前面的数字是不能相邻的
                {
                    dp[i][j]+=dp[i-1][x];
                    dp[i][j]%=mod;
                }
    __int64 sum = 0;
    for(i = 1; i<k; i++)
    {
        sum+=dp[l][i];
        sum%=mod;
    }
    printf("%I64d\n",sum%mod);

    return 0;
}

心得:i是几个数,j是最后一个数,动态规划要想好数组,找好边界

7
问题描述

有一棵 n 个节点的树,树上每个节点都有一个正整数权值。如果一个点被选择了,那么在树上和它相邻的点都不能被选择。求选出的点的权值和最大是多少?

输入格式

第一行包含一个整数 n 。

接下来的一行包含 n 个正整数,第 i 个正整数代表点 i 的权值。

接下来一共 n-1 行,每行描述树上的一条边。

输出格式
输出一个整数,代表选出的点的权值和的最大值。
样例输入
5
1 2 3 4 5
1 2
1 3
2 4
2 5
样例输出
12
样例说明
选择3、4、5号点,权值和为 3+4+5 = 12 。
数据规模与约定

对于20%的数据, n <= 20。

对于50%的数据, n <= 1000。

对于100%的数据, n <= 100000。

权值均为不超过1000的正整数。

AC:
查看网址http://www.tuicool.com/articles/3eimue
#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <algorithm>

#define M 100100 //最大长度

using namespace std;

typedef struct Node

{

	int vex;

	Node* next;

}Child;

Child* head[M];//链表头数组

int f[M][2], power[M], visit[M];

//pow[]权值数组,p[i]表示第i个节点的权值 
//f[i][1]保留节点i时最大权值,f[i][0]不保留节点i时的最大权值 
//visit[i]==1表示i点被访问过,visit[i]==0表示节点i未被访问过

//添加边(对称的) 
void addADJ(int u, int v)

{

	Child *p, *q;

	p = (Child*)malloc(sizeof(Child));

	p->vex = v;

	p->next = head[u];

	head[u] = p;

	q = (Child*)malloc(sizeof(Child));

	q->vex = u;

	q->next = head[v];

	head[v] = q;

}

//动态规划获取结果

void GetResul(int v)

{

	visit[v] = 1;

	Child *p;

	for (p = head[v]; p != NULL; p = p->next)

	{

		if (visit[p->vex] == 0)

		{

			GetResul(p->vex);

			f[v][1] = f[v][1] + f[p->vex][0];

			f[v][0] += max(f[p->vex][0], f[p->vex][1]);

		}

	}

	f[v][1] += power[v];

}

int main()

{

	int i, j, u, v, n;

	memset(head, NULL, sizeof(head));

	memset(f, 0, sizeof(f));

	memset(visit, 0, sizeof(visit));

	scanf("%d", &n);

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

	{

		scanf("%d", &power[i]);

	}

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

	{

		scanf("%d%d", &u, &v);

		addADJ(u, v);

	}

	GetResul(1);//从节点1开始进行动态规划

	printf("%d\n", max(f[1][0], f[1][1]));//结果输出

	return 0;

}
心得:注意头插法,还有动态规划的思想,注意数组值常常为答案。


8
问题描述

给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环)。请你计算从1号点到其他点的最短路(顶点从1到n编号)。

输入格式

第一行两个整数n, m。

接下来的m行,每行有三个整数u, v, l,表示u到v有一条长度为l的边。

输出格式
共n-1行,第i行表示1号点到i+1号点的最短路。
样例输入
3 3
1 2 -1
2 3 -1
3 1 2
样例输出
-1
-2
数据规模与约定

对于10%的数据,n = 2,m = 2。

对于30%的数据,n <= 5,m <= 10。

对于100%的数据,1 <= n <= 20000,1 <= m <= 200000,-10000 <= l <= 10000,保证从任意顶点都能到达其他所有顶点。

参考网址http://blog.youkuaiyun.com/libin56842/article/details/19910545

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std;


const int inf = 1<<30;
const int L = 200000;


struct Edges
{
    int x,y,w,next;
} e[L<<2];


int head[L];
int dis[L];
int vis[L];
int cnt[L];


void AddEdge(int x,int y,int w,int k)
{
    e[k].x = x,e[k].y = y,e[k].w = w,e[k].next = head[x],head[x] = k;
}
int relax(int u,int v,int c)
{
    if(dis[v]>dis[u]+c)
    {
        dis[v] = dis[u]+c;
        return 1;
    }
    return 0;
}


int SPFA(int src)
{
    int i;
    memset(cnt,0,sizeof(cnt));
    dis[src] = 0;
    queue<int> Q;
    Q.push(src);
    vis[src] = 1;
    cnt[src]++;
    while(!Q.empty())
    {
        int u,v;
        u = Q.front();
        Q.pop();
        vis[u] = 0;
        for(i = head[u]; i!=-1; i=e[i].next)
        {
            v = e[i].y;
            if(relax(u,v,e[i].w)==1 && !vis[v])
            {
                Q.push(v);
                vis[v] = 1;
            }
        }
    }
}


int main()
{
    int t,n,m;
    int i,j;
    scanf("%d%d",&n,&m);
    memset(e,-1,sizeof(e));
    for(i = 1; i<=n; i++)
    {
        dis[i] = inf;
        vis[i] = 0;
        head[i] = -1;
    }
    for(i = 0; i<m; i++)
    {
        int x,y,w;
        scanf("%d%d%d",&x,&y,&w);
        AddEdge(x,y,w,i);
    }
    SPFA(1);
    for(i = 2; i<=n; i++)
        printf("%d\n",dis[i]);

    return 0;
}
心得:和上题非常类似,注意头插法,以及SPFA的模板。

9


问题描述
  生成n个∈[a,b]的随机整数,输出它们的和为x的概率。
输入格式
  一行输入四个整数依次为n,a,b,x,用空格分隔。
输出格式
  输出一行包含一个小数位和为x的概率,小数点后保留四位小数
样例输入
2 1 3 4
样例输出
0.3333
数据规模和约定
  对于50%的数据,n≤5.
  对于100%的数据,n≤100,b≤100.


AC:
#include<iostream>
#include<cstdio>
using namespace std;
double dp[101][10001];
bool f[101][10001];
int n, a, b, xx;

double dfs(int i, int j)
{
	if (f[i][j]) return dp[i][j];
	f[i][j] = true;
	if (i == 0)
	if (j == 0)
		return dp[i][j] = 1;
	else return dp[i][j] = 0;

	for (int q = b; q >= a; q--)
	if (j - q >= 0)
		dp[i][j] += dfs(i - 1, j - q);
	dp[i][j] /= double(b - a + 1);
	return dp[i][j];

}
int main()
{
	scanf("%d%d%d%d", &n, &a, &b, &xx);

	printf("%.4lf", dfs(n, xx));
	return 0;
}
10

问题描述

Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路。道路被用来连接N个牧场,牧场被连续地编号为1到N。每一个牧场都是一个奶牛的家。FJ计划除去P条道路中尽可能多的道路,但是还要保持牧场之间 的连通性。你首先要决定那些道路是需要保留的N-1条道路。第j条双向道路连接了牧场Sj和Ej(1 <= Sj <= N; 1 <= Ej <= N; Sj != Ej),而且走完它需要Lj的时间。没有两个牧场是被一条以上的道路所连接。奶牛们非常伤心,因为她们的交通系统被削减了。你需要到每一个奶牛的住处去安慰她们。每次你到达第i个牧场的时候(即使你已经到过),你必须花去Ci的时间和奶牛交谈。你每个晚上都会在同一个牧场(这是供你选择的)过夜,直到奶牛们都从悲伤中缓过神来。在早上 起来和晚上回去睡觉的时候,你都需要和在你睡觉的牧场的奶牛交谈一次。这样你才能完成你的 交谈任务。假设Farmer John采纳了你的建议,请计算出使所有奶牛都被安慰的最少时间。

输入格式

第1行包含两个整数N和P。

接下来N行,每行包含一个整数Ci。

接下来P行,每行包含三个整数Sj, Ej和Lj。

输出格式
输出一个整数, 所需要的总时间(包含和在你所在的牧场的奶牛的两次谈话时间)。
样例输入
5 7
10
10
20
6
30
1 2 5
2 3 5
2 4 12
3 4 17
2 5 15
3 5 6
样例输出
176
数据规模与约定

5 <= N <= 10000,N-1 <= P <= 100000,0 <= Lj <= 1000,1 <= Ci <= 1,000。

#include<iostream>
#include<algorithm>
using namespace std;


int p[100005];

int c[10005];

struct edge
{
    int u;
    int v;
    int w;
    
    bool operator<(const edge &a)  const
    {
        return  c[u]+c[v]+2*w<c[a.u]+c[a.v]+2*a.w;
        
    }
};


edge e[100005];

int n,esize;


void init()
{
    for(int i=0;i<n;i++)
        p[i]=i;
    
}
int find(int x)
{
    return p[x]==x?x:p[x]=find(p[x]);
    
}

int kruskal()
{
    
    
    int ans=0;
    for(int i=0;i<esize;i++)
    {
        int x=find(e[i].u);
        int y=find(e[i].v);
        
        if(x!=y)
        {
            ans+=2*e[i].w+c[e[i].u]+c[e[i].v];
            p[x]=y;
        }
        
    }
    
    
    return ans;
}


int main()
{
   
    
    int p;
    cin>>n>>p;
    
    esize=p;
    
    
    init();
    
    int min_c=1000000000;
    for(int i=0;i<n;i++)
    {
      cin>>c[i];
      if(c[i]<min_c)  min_c=c[i];
    }
    int u,v,w;
    
 
    
    for(int i=0;i<p;i++)
    {
        cin>>u>>v>>w;
        e[i].u=u-1;
        e[i].v=v-1;
        e[i].w=w;
    }
    
    sort(e,e+esize);
    
    int ans=kruskal();
    

    
    ans+=min_c;
    
    cout<<ans<<endl;
    
    

}
心得:kruskal算法的使用以及并合集的使用。


11
问题描述
  任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001。
  将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面,可得到如下表达式:137=2^7+2^3+2^0
  现在约定幂次用括号来表示,即a^b表示为a(b)
  此时,137可表示为:2(7)+2(3)+2(0)
  进一步:7=2^2+2+2^0 (2^1用2表示)
  3=2+2^0 
  所以最后137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0)
  又如:1315=2^10+2^8+2^5+2+1
  所以1315最后可表示为:
  2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
输入格式
  正整数(1<=n<=20000)
输出格式
  符合约定的n的0,2表示(在表示中不能有空格)
样例输入
137
样例输出
2(2(2)+2+2(0))+2(2+2(0))+2(0)
样例输入
1315
样例输出
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

提示
用递归实现会比较简单,可以一边递归一边输出

#include<stdio.h>
int main()
{
    int n;
    void cimi(int n);
    while(scanf("%d",&n)!=EOF)
    {
        cimi(n);
        printf("\n");
    }
    return 0;
}
void cimi(int n)
{
    int num;
    int i,j,k;
    int a[32];//数组定义为局部变量 
    num=0;
    i=0;
    while(n)
    {
        j=n%2;
        if(j==1)
            a[num++]=i;//存储第几次是1 
        i++;
        n/=2;
    }
    for(i=num-1;i>=0;i--)
    {
        if(a[i]==0)
            printf("2(0)");
        else if(a[i]==1)
            printf("2");
        else if(a[i]==2)
            printf("2(2)");
        else if(a[i]>2)
        {
            printf("2(");
            cimi(a[i]);
            printf(")");
        }
        if(i!=0)
            printf("+");//如果不是最后一个就得输出 +  
    }
}

12

问题描述
  给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。
输入格式
  第一行一个数字L。
  第二行是字符串S。
  L大于0,且不超过S的长度。
输出格式
  一行,题目要求的字符串。

  输入样例1:
  4
  bbaabbaaaaa

  输出样例1:
  bbaa

  输入样例2:
  2
  bbaabbaaaaa

  输出样例2:
  aa
数据规模和约定
  n<=60
  S中所有字符都是小写英文字母。

  提示
  枚举所有可能的子串,统计出现次数,找出符合条件的那个

AC:

#include<string>
#include<iostream>
using namespace std;



int main()
{
	int l,sum=0,flag=-1;
	cin >> l;
	string s;
	cin >> s;
	string temp,res;
	for (int i = 0; i < s.length()-3; i++)
	{
		sum = 0;
		temp=s.substr(i,l);
		for (int j = 0; j < s.length()-3; j++)
		{
			if (temp==s.substr(j,l))
			{
				sum++;
			}
		}
		if (sum>flag)
		{
			flag = sum;
			res = temp;
		}
	}
	cout << res;
	return 0;
}

心得:主要还是对系统函数(字符串函数)的应用


13


从键盘读入n个整数放入数组中,编写函数CompactIntegers,删除数组中所有值为0的元素,其后元素向数组首端移动。注意,CompactIntegers函数需要接受数组及其元素个数作为参数,函数返回值应为删除操作执行后数组的新元素个数。输出删除后数组中元素的个数并依次输出数组元素。  样例输入: (输入格式说明:5为输入数据的个数,3 4 0 0 2 是以空格隔开的5个整数)
  5
  3 4 0 0 2
  样例输出:(输出格式说明:3为非零数据的个数,3 4 2 是以空格隔开的3个非零整数)
  3
  3 4 2
样例输入
7
0 0 7 0 0 9 0
样例输出
2
7 9
样例输入
3
0 0 0

样例输出
0

AC:

include<string>
#include<iostream>
using namespace std;

int CompactIntegers(int *p, int n)
{
	int num=n;
	int i = 0;
	while (i<num)
	{
		if (p[i]==0)
		{
			for (int j = i; j < num-1; j++)
			{
				p[j] = p[j + 1];
			}
			num--;
			i = -1;
		}
		i++;
	}
		
	return num;
}

int main()
{
	int n;
	cin >> n;
	int *p = new int[n];
	for (int i = 0; i <n; i++)
	{
		cin >> p[i];
	}
	int num = CompactIntegers(p,n);
	cout << num << endl;
	for (int i = 0; i < num; i++)
	{
		cout << p[i] << " ";
	}
	

}


心得:搞不清楚的话多在纸上写一写


14

问题描述
  对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢?
输入格式
  第一行一个数表示数据组数
  每组输入数据共2行:
  第1行给出总共的数字的个数n和要取的数的个数m,1<=n<=m<=15,
  第2行依次给出这n个数,其中每个数字的范围满足:a[i]的绝对值小于等于4。
输出格式
  每组数据输出1行,为最大的乘积。
样例输入
1
5 5
1 2 3 4 2
样例输出
48


说明:这道题目一直通不过,用的是回溯法,不过自己认为还是有一定的参考价值。特别将它贴出来.,对于挑选问题,回溯法还是有优势的


#include<iostream>
#include <string.h>
using namespace std;

int x[16];
int a, b,m,amax;

void fun(int k,int sum)
{
	if (k > a)
	{
		if (m == b)
		{
			if (sum>amax)
			{
				amax = sum;
				return;
			}
		}
		return;
	}
	if (m<b)
	{
		sum *= x[k-1];
		m++;
		fun(k + 1,sum);
		sum /= x[k-1];
		m--;
	}
	fun(k + 1, sum);
}

int main()
{
	int n;
	cin >> n;
	while (n--)
	{
		memset(x,0,sizeof(x));
		int sum;
		m = 0,amax=0,sum=1;
		cin >> a>> b;
		for (int i = 0; i < a;i++)
		{
			cin >> x[i];
		}
		fun(1,sum);
		cout << amax;
	}
	return 0;
}


以上便是寒假所看的有一些蓝桥杯的题目

2024年蓝桥杯嵌入式比赛的准备心得和比赛资源注意事项(附赛事资源包) 蓝桥杯嵌入式组比赛最主要考验的是对于stm32相关方面的编程能力,以及选择填空方面的电子学科基础知识和对硬件的了解,和其它赛道的纯软方向不同,电子类单片机组和嵌入式组更加偏向硬件,要求参赛者具备数电模电、ARM Cortex M4硬件资源和软件编程与调试等知识。当然这对于大一新生自然是有难度的,因为有些学校大一上学期并不开设数电模电课程,需要自学相关内容,好在考察并不是很深入。 阅读详情

相关推荐

蓝桥杯备赛常用算法心得

订阅专栏 优快云话题挑战赛第1期 活动详情地址:https://marketing.youkuaiyun.com/p/bb5081d88a77db8d6ef45bb7b6ef3d7f 参赛话题:大学生竞赛指南 话题描述:本话题聚焦于大学生竞赛心得体会分享,对于计算机众多领域每年都有很多都会举办科技竞赛,很多学生也都会踊跃参与,每到竞赛结束,学生们都会收获很多,这个时候我们可以写下一篇竞赛心得,大家互相交流学习科技竞赛经验,共同分享竞赛资源、探讨各领域技术以及比赛技巧,希望大家能够在此话题下一起讨论一起学习,能够

m0_70929749的博客 503

“蓝桥杯”练习系统(基础篇)

蓝桥杯训练系统基础篇题解

GeekTony的博客 1588

300块买来的道理之2019蓝桥杯反思

本次蓝桥杯只拿二等奖近期的原因在于我的应试能力很差而又不注重练习而导致的。 上面的话总结的很正确,刚和班里得了一等奖的同学交流了一下,人家迷宫没做出来,但是倒数第二题和第三题做出来了,他们在洛谷以及别的网站上刷了一个月的题。虽然只做了二三十道,但里面还有一些提高组这题,这就是为什么人家碰到难题有信心去挑战未知,有这个能力让自己能够去对付自己没有碰到过的敌人,并从中找出一定规律使得他们能够对一个问题...

C Y 2万+

【算法练习】蓝桥杯日常练习系统(礼物、数的潜能、娜神平衡、粘木棍、车的放置、最大分解、Substrings、线性筛、乘积最大、递增三元组、倍数问题、结账问题、无聊的逗)

一、礼物(前缀和 + 二分答案) 对石子个数进行二分,然后去check当前石子数是否满足要求,一直逼近石子的最大值即可,关键在于要处理好前缀和的下标关系。例如,现在从 i 的位置开始划分,取k个石子,前面k个石子的重量 = preSum[i] - preSum[i - k],后面k个石子的重量 = preSum[i + k] - preSum[i]。 另外就是用BufferReader加快读取速度。 import java.io.BufferedReader; import java.io.IOExcep

Mxeron的博客 1752

手把手拆解固态电池成本:2030年真能比液态电池便宜30%吗?

本文深度解析固态电池成本结构,探讨2030年实现比液态电池便宜30%的可行性路径。通过拆解正极材料、负极材料和固态电解质的成本演变,分析关键技术对降本的影响,并预测产业链协同效应下的成本优化趋势。文章指出,在材料创新、设备国产化和政策支持等多重因素推动下,固态电池有望在2030年实现显著降本目标。

kite3的博客 400

stm32控制舵机_使用URT-1控制飞特舵机上手教程(SM40BL舵机为例)

使用URT-1控制飞特舵机上手教程(SM40BL舵机为例):1,参阅URT-1使用说明.pdf2, 材料清单:① URT-1驱动板② 连接驱动板与电脑的MINI USB 连接线③ 给舵机供电的电源④ 舵机与舵机连接线⑤ 杜邦线(可选)3,将URT-1驱动板与电脑连接4,安装驱动,参阅文件CH340驱动,检查设备管理器串口号。5,舵机连接URT-1驱动板,驱动板接电源,参考下图:6,打开FD软件进行...

weixin_39564510的博客 3431

蓝桥杯练习系统(算法训练)ALGO-977 P0805大数乘法

当两个比较大的整数相乘时,可能会出现数据溢出的情形。为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法。具体来说,首先以字符串的形式输入两个整数,每个整数的长度不会超过10位,然后把它们相乘的结果存储在另一个字符串当中(长度不会超过20位),最后把这个字符串打印出来。例如,假设用户输入为:62773417和12345678,则输出结果为:774980393241726.例如:计算12345678×9,显然是被乘数中的最低位8和乘数9相乘。由于计算乘法时,先计算低位,因此a[0]存储大数的低位。

m0_73801775的博客 1032

Superpowers:可编程AI协作协议与Skill工程化实践

AI编程正从提示词驱动迈向工程化协作新范式。Superpowers并非传统代码补全工具,而是一套定义清晰、可版本控制、可调试复用的AI协作协议——它将AI能力抽象为带输入校验、执行管道、输出契约和元数据声明的Skill(类DSL构件),再通过状态驱动的Workflow编排实现跨平台、可熔断、含人工Checkpoint的自动化流水线。其核心价值在于解决AI生成代码长期存在的不可复现、不可审计、不可交接三大痛点,支撑OpenAPI转TS、Figma转Vue等高复用场景落地。本文深入解析Skill设计四重契约与P

weixin_31124163的博客 376

Python蓝桥杯真题——基础练习(一)

Python蓝桥杯练习系统真题满分答案全解

Insight__的博客 8270

AI报告撰写实战指南:从提示词工程到全流程优化的底层逻辑与实践突破

传统AI写作常被诟病为“信息拼贴”——模型虽能生成文本,却常出现逻辑断裂、数据矛盾、风格不符等问题。而“全流程优化”则是通过系统化设计,将报告生成拆解为需求解析→数据对齐→提示词设计→初稿生成→迭代优化→格式适配六大环节,每个环节均通过技术手段提升输出质量。提示词工程:本质是通过结构化指令(如角色设定、任务分解、格式约束、示例引导)精准控制模型输出方向,是连接用户需求与模型能力的“翻译器”。全流程优化。

2501_92808811的博客 884

antv x6 沿边图标循环动画实现

2.使用transition给边设置动画,利用complte方法实现循环动画。实现效果,如下图,边上存在两个图标,要求图标延边一直循环动画。1.注册一个自定义边,边上定义两个图标,并设置其初始位置。

lingliu0824的博客 3366

蓝桥杯练习系统——练习

蓝桥杯练习系统——算法训练

m0_66291385的博客 363

Window系统下搭建GIT本地服务器

这是一篇在window下搭建git本地服务器的教程,带你一步步搭建出本地的git服务器。

qwer971211的博客 2万+

蓝桥杯历年真题源码及解析

本人参加了2019年蓝桥杯甘肃赛区Java B组的比赛。以下分享一下学习过程中的相关资料和体会心得。 蓝桥杯历年真题源码及解析(Java B组|2013-2017) [GitHub源码下载((https://github.com/Stephen-hj/LanQiaoCup) 体会: ...

八归少年 4225

勇闯dify v1.0.0之设置模型供应商。解决:Reached maximum retries (3) for URL https://marketplace.dify.ai/

朋友们,大家好,今天带大家来勇闯dify v1.0.0。为什么叫勇闯呢?我就这么说吧,本来我昨天就想带大家勇闯v1.0.0的。但是dify的marketplace访问不了。公司的网和手机热点都试了,就是访问不了。我们连个模型都没有,还勇闯个球啊,对吧,就搁置了。今天,我赶紧看看这个marketplace好了没。一看,可以了。赶紧写下这篇博客,帮助同志们走出困境。

xiezhipu的博客 4616

【OpenClaw从入门到精通】第45篇:Skill供应链安全——如何识别并避开恶意技能插件?(2026实测版)

随着OpenClaw生态爆发式增长,全球Skills总量近75万个,日均新增2.1万个,但恶意/问题插件已超600个,数十万用户受影响。本文基于奇安信威胁报告及360安全实践,拆解恶意技能的五大核心特征,提出"安装前三步法"安全审查流程,详解安全技能来源白名单与定期审计方案,并深度解析360龙虾Skill安全超市的分级认证机制。读者可掌握从技能筛选、安装审查到术后审计的全流程安全防护手段,通过实操命令与案例演示,零成本构建Skill供应链安全防线,避免遭遇私钥窃取、资产损失等安全事件。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 561

十一届蓝桥杯嵌入式——心得

第十一届蓝桥杯嵌入式总结 11月14号决赛比完,15号就出成绩了。这速度真的很快。(不过官方发放获奖证书的速度要有这么快就好了,小小的吐槽一下) 心得: 决赛结果还不错,国赛一等奖。也算是对得起我大半年的努力。 没有容易的事,疫情的影响,比赛也是从上半年三月份拖到了下半年10月份。在中途很多人都退钱放弃了这个比赛。*(我学校是这样) 不过大家既然报了名,就要认真去对待他。在寒假的时候把省赛的各个模块都给学完,然后是做了两三套省赛题。在三月份之前,我怕还会比赛,我就把自己学过的复习了一遍。但是延期了,在九月份

徐真天的小小锦囊 9912

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

蓝桥杯介绍&心得总结

蓝桥杯介绍&心得 章节目录 蓝桥杯简介 蓝桥杯比赛心得 蓝桥杯的重点知识点总结 如何学习蓝桥杯相关知识 资源简介 一、蓝桥杯简介 重点详细内容知识点总结 蓝桥杯定义: 蓝桥杯全国软件和信息技术专业人才大赛(简称“蓝桥杯”)是由中华人民共和国工业和信息化部人才交流中心主办的一项全国性IT学科竞赛。 该赛事旨在发掘并培养计算机与信息技术领域的专业人才,提升参赛者的编程技能和算法理解能力。 赛事组别与考试时长: 赛事分为省赛和国赛两个阶段,覆盖多个领域,包括C/C++程序设计、Java程序设计、Pytho

m0_72216164的博客 1785

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

蓝桥杯软件测试心得

蓝桥杯软件测试这个赛道刚创办两年,所以题目相对简单。再加上参加的人数少,获奖几率真的很大。只需认真学习半个月做做真题就能拿奖!!!看完那些真题解析视频后多练习,只需两套模拟题就能得心应手了。excel表格一定不要忽视,功能测试第一题会用到。这次比赛我就吃亏在这,不然还能多出半小时做题。一、二、1.2.

weixin_65820117的博客 2652

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

蓝桥杯省赛及国赛准备心得和经验

前言 第一次参加蓝桥杯(第十一届)已是大三,今后估计也没有什么时间和精力参加这种算法竞赛了,所以我在带大一师弟的时候奉劝他们尽早参加算法竞赛,毕竟这个没什么门槛,一些高中生都能达到很高的水平(我一个上幼儿园的侄女也报了蓝桥杯培训班),只要会用一门编程语言就可以上手。想来自己有一些心得和经验可以拿出来分享。 我省赛答对8道题,省一,然后参加国赛,答对5道题,国二,差几名国一,学校给了800奖金和一个U盘,一个获国一的奖了移动硬盘看得我眼馋。 时间 蓝桥杯从上午九点到下午一点有四个小时,国赛的时候监考老师给了一

袁钰琦的博客 2万+

第八届蓝桥杯参赛心得

第八届蓝桥杯总结 我是非985、211的大二学生,第一次参赛,报名A组,省赛第一名,全国三等奖。 为什么报A组? 一,我们学校是省里最好的,不弱于人; 二、以为只有A组在北大比赛,想去北大看看。 三、还算年轻,还有大三、大四。 省赛 题目链接: https://wenku.baidu.com/view/951dab772a160b4e767f5acfa1c7aa00b52a9d2d

survivorone的博客 3542

2016年蓝桥杯比赛心得

通过半年准备,终于结束了今年蓝桥杯。比赛结果暂时还不知道,但是通过这几个月的经历,分享一些自己心得。 (我的情况:三本院校,蓝桥杯c/c++ B组,大二) 1 ..既然是学计算机的,那么反复练习则是必不可少的,有人说过一个伟大的程序猿至少要十万行代码,这个绝不是危言耸听,要想了解电脑,让电脑按照你的思路解题,没有长时间的与电脑的磨合是肯定不行的,只有通过反复敲打代码,才能与电脑做到人机...

CoderWangSon 1万+

蓝桥杯参赛经历/备赛心得

蓝桥杯的目标从来不只是“得奖”,更重要的是——在准备的过程中,你将构建起真正的编程实力,拿到属于你的第一块算法勋章。📢 你也准备参加蓝桥杯吗?是第一次参赛还是卷第二年了?留言说说你遇到的难题、不会的算法,我可以帮你一起分析思路!需要我再帮你写一篇蓝桥杯某年真题解析、训练计划表、刷题路线图之类的内容,也完全没问题!你想往哪边展开?

ajie1117的博客 1219

2019第十届蓝桥杯大赛(JavaA组)心得

比赛结果 第一次参加这个比赛,花300块水了一个省二等奖,没进入国赛有点遗憾。 关于这个比赛 首先,说这个比赛,很多人将之称为“暴搜杯”,用来调侃这个比赛很多题只需掌握暴力搜索算法即可。其实不然,博主通过观察这几年的题,发现难度正在慢慢加大,能用暴力搜索方法解题的比例慢慢减少。其次,这个比赛报名费用为300,而且知名度不咋低,所以博主建议参加一次就好了,多了没啥意...

suelta_th的博客 4182

蓝桥杯Python这一篇就够了-训练系统题库合集(包括VIP试题)&数据结构与算法

第一版写于2020-11-13,第十一届蓝桥杯国赛前夕,老师和同学建议说写博文可以让学习更高效,陆陆续续写一些题解和学习笔记,在我的代码中我加了很多有助于理解程序的注释,希望这篇博客可以帮助你在蓝桥杯比赛或python学习取得进展。 一起进步,冲! 目录一、蓝桥杯题库1.1入门训练1.2基础练习 一、蓝桥杯题库 1.1入门训练 Fibonacci数列 圆的面积 序列求和 A+B问题 1.2基础练习 数列排序 十六进制转八进制 十六进制转十进制 ...

Harry______的博客 12万+

2024年博客之星主题创作|2024年蓝桥杯与数学建模年度总结与心得

回顾2024年的蓝桥杯和数学建模竞赛,既是一次技术能力的挑战,也是一次自我提升的旅程。这两项竞赛让我深刻认识到算法思维和数学建模能力的重要性,也让我更加坚定了在未来的技术道路上,深入探索和研究的决心。展望未来,我将继续提升自己的算法能力,深入研究更复杂的数学建模方法,为未来的学术研究和工程实践奠定坚实的基础。

ChoSeitaku的博客 1780
下一篇: C++重新学习心得(1)(《C++Primer第四版》1-8章)
King来写代码
博客等级 码龄12年 68粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值