- 点击跳转专栏=>Unity3D特效百例
- 点击跳转专栏=>案例项目实战源码
- 点击跳转专栏=>游戏脚本-辅助自动化
- 点击跳转专栏=>Android控件全解手册
- 点击跳转专栏=>Scratch编程案例
- 点击跳转=>软考全系列
- 点击跳转=>蓝桥系列
👉关于作者
专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)
有什么需要欢迎底部卡片私我,获取更多支持,交流让学习不再孤单。
👉实践过程
需要所有整理的文档可底部卡片联系我,直接发压缩包。
😜操作格子
问题描述
有n个格子,从左到右放成一排,编号为1-n。
共有m次操作,有3种操作类型:
1.修改一个格子的权值,
2.求连续一段格子权值和,
3.求连续一段格子的最大值。
对于每个2、3操作输出你所求出的结果。
输入格式
第一行2个整数n,m。
接下来一行n个整数表示n个格子的初始权值。
接下来m行,每行3个整数p,x,y,p表示操作类型,p=1时表示修改格子x的权值为y,p=2时表示求区间[x,y]内格子权值和,p=3时表示求区间[x,y]内格子最大的权值。
输出格式
有若干行,行数等于p=2或3的操作总数。
每行1个整数,对应了每个p=2或3操作的结果。
样例输入
4 3
1 2 3 4
2 1 3
1 4 3
3 1 4
样例输出
6
3
数据规模与约定
对于20%的数据n <= 100,m <= 200。
对于50%的数据n <= 5000,m <= 5000。
对于100%的数据1 <= n <= 100000,m <= 100000,0 <= 格子权值 <= 10000。
#include <stdio.h>
#define N 100000
#define A 1000
#define B 100int sum(int* a, int m, int n)
{int i, s = 0;for (i = m; i <= n; i++)s += a[i];return s;
}int max(int* a, int m, int n)
{int i, s = a[m];for (i = m + 1; i <= n; i++)if (s < a[i])s = a[i];return s;
}int main()
{int i, j, k, m, n;int a[100000], b[100000][3], c[A][2] = {0};scanf("%d%d", &n, &m);for (i = 0; i < n; i++)scanf("%d", &a[i]);for (i = 0; i < m; i++)for (j = 0; j < 3; j++)scanf("%d", &b[i][j]);for (i = 0; i < (n + B - 1) / B; i++){c[i][0] = c[i][1] = a[i * B];for (j = i * B + 1; j < i * B + B && j < n; j++){c[i][0] += a[j];if (c[i][1] < a[j])c[i][1] = a[j];}}for (i = 0; i < m; i++){if (b[i][0] == 1){c[(b[i][1] - 1) / B][0] += b[i][2] - a[b[i][1] - 1];k = (b[i][1] - 1) / B;if (c[k][1] <= b[i][2]){c[k][1] = b[i][2];}else if (a[b[i][1] - 1] == c[k][1]){a[b[i][1] - 1] = b[i][2];c[k][1] = max(a, k * B, k * B + B > n ? n - 1 : k * B + B - 1);}a[b[i][1] - 1] = b[i][2];}else if (b[i][0] == 2){int s = 0;b[i][1]--, b[i][2]--;int o = b[i][2] / B - b[i][1] / B;if (o < 2){s = sum(a, b[i][1], b[i][2]);}else{s = sum(a, b[i][1], (b[i][1] + B) / B * B - 1);s += sum(a, b[i][2] / B * B, b[i][2]);for (j = b[i][1] / B + 1; j < b[i][2] / B; j++)s += c[j][0];}printf("%d\n", s);}else if (b[i][0] == 3){int s = 0, t;b[i][1]--, b[i][2]--;int o = b[i][2] / B - b[i][1] / B;if (o < 2){s = max(a, b[i][1], b[i][2]);}else{s = max(a, b[i][1], (b[i][1] + B) / B * B - 1);t = max(a, b[i][2] / B * B, b[i][2]);if (s < t) s = t;for (j = b[i][1] / B + 1; j < b[i][2] / B; j++)if (s < c[j][1])s = c[j][1];}printf("%d\n", s);}}return 0;
}
😜查找整数
问题描述
给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。
输入格式
第一行包含一个整数n。
第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。
第三行包含一个整数a,为待查找的数。
输出格式
如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1。
样例输入
6
1 9 4 8 3 9
9
样例输出
2
数据规模与约定
1 <= n <= 1000。
#include <stdio.h>int main()
{int i, m, n, a[1000];scanf("%d", &n);for (i = 0; i < n; i++)scanf("%d", &a[i]);scanf("%d", &m);for (i = 0; i < n; i++)if (a[i] == m) break;if (i == n)printf("-1");elseprintf("%d", i + 1);return 0;
}
😜分解质因数
问题描述
求出区间[a,b]中所有整数的质因数分解。
输入格式
输入两个整数a,b。
输出格式
每行输出一个数的分解,形如k=a1a2a3…(a1<=a2<=a3…,k也是从小到大的)(具体可看样例)
样例输入
3 10
样例输出
3=3
4=22
5=5
6=23
7=7
8=222
9=33
10=25
提示
先筛出所有素数,然后再分解。
数据规模和约定
2<=a<=b<=10000
#include <stdio.h>
#include <math.h>int factor(n)
{int i, j = (int)sqrt(n);if (n % 2 == 0) return 2;for (i = 3; i <= j; i++)if (n % i == 0) return i;return n;
}int main()
{int i, j, k, m, n;scanf("%d%d", &m, &n);for (i = m; i <= n; i++){j = factor(i);k = i / j;printf("%d=%d", i, j);while (k > 1){j = factor(k);k /= j;printf("*%d", j);}printf("\n");}return 0;
}
😜高精度加法
问题描述
输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。
算法描述
由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。
定义一个数组A,A[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储b。
计算c = a + b的时候,首先将A[0]与B[0]相加,如果有进位产生,则把进位(即和的十位数)存入r,把和的个位数存入C[0],即C[0]等于(A[0]+B[0])%10。然后计算A[1]与B[1]相加,这时还应将低位进上来的值r也加起来,即C[1]应该是A[1]、B[1]和r三个数的和.如果又有进位产生,则仍可将新的进位存入到r中,和的个位存到C[1]中。依此类推,即可求出C的所有位。
最后将C输出即可。
输入格式
输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。两个整数都不超过100位,两数的最高位都不是0。
输出格式
输出一行,表示a + b的值。
样例输入
20100122201001221234567890
2010012220100122
样例输出
20100122203011233454668012
#include <stdio.h>int main()
{int i;char a[101], b[101], c[102] = {0};scanf("%s%s", a, b);int alen = strlen(a);int blen = strlen(b);for (i = 0; i < alen || i < blen; i++){if (i < alen)c[i] += a[alen-i-1] - '0';if (i < blen)c[i] += b[blen-i-1] - '0';if (c[i] >= 10){c[i+1] = c[i] / 10;c[i] %= 10;}}if (alen < blen) alen = blen;if (c[alen] > 0) printf("%d", c[alen]);for (i = alen - 1; i >= 0; i--)printf("%d", c[i]);return 0;
}
👉其他
📢作者:小空和小芝中的小空
📢转载说明-务必注明来源:https://zhima.blog.csdn.net/
📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。
温馨提示:点击下方卡片获取更多意想不到的资源。