- 点击跳转专栏=>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 100
int 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");
else
printf("%d", i + 1);
return 0;
}
😜分解质因数
问题描述
求出区间[a,b]中所有整数的质因数分解。
输入格式
输入两个整数a,b。
输出格式
每行输出一个数的分解,形如k=a1*a2*a3...(a1<=a2<=a3...,k也是从小到大的)(具体可看样例)
样例输入
3 10
样例输出
3=3
4=2*2
5=5
6=2*3
7=7
8=2*2*2
9=3*3
10=2*5
提示
先筛出所有素数,然后再分解。
数据规模和约定
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/
📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。
温馨提示:点击下方卡片获取更多意想不到的资源。