先把上一次的补题交了
由题知道只要第二次输入字符数组里面由a就是无限循环得出结果是-1,而且当第二次输入字符串长度也只有1时是输出1。其余直接用2的len1次方得出结果。代码如下
#include<stdio.h>
#include<string.h>
#include <math.h>
int main()
{
int n;
char a[51],s[51];
scanf("%d",&n);
while (n--)
{
getchar();
scanf("%s",a);
getchar();
scanf("%s",s);
int len1=strlen(a);
int len2=strlen(s);
int flag=0;
for(int i=0;i<len2;i++)
{
if(s[i]=='a')
flag=1;
}
if(flag==1&&len2>1)
printf("-1\n");
if(flag==0)
printf("%.0lf\n",pow(2,len1));
if(flag==1&&len2==1)
printf("1\n");
}
return 0;
}
这个题目根据题意知道它方向不一样的结果也是不一样的,要注意。只要求出首位到第x位的所坠落的伤害总和然后求区间和就行,暴力是行不通的。
#include <stdio.h>
#define MAX_N 100001
long long a[MAX_N], s, t, ans, b[MAX_N], c[MAX_N];
int main() {
int n, m;
int i;
scanf("%d %d", &n, &m);
for (i = 1; i <= n; ++i)
{
scanf("%lld", &a[i]);
}
for (i = 2; i <= n; ++i)
{
if (a[i - 1] > a[i])
{
b[i] = b[i - 1] + a[i - 1] - a[i];
} else {
b[i] = b[i - 1];
}
}
for (i = n - 1; i >= 1; --i)
{
if (a[i + 1] > a[i])
{
c[i] = c[i + 1] + a[i + 1] - a[i];
} else
{
c[i] = c[i + 1];
}
}
for (i = 1; i <= m; ++i)
{
scanf("%lld %lld", &s, &t);
if (s < t)
{
printf("%lld\n", b[t] - b[s]);
}
if (s > t)
{
printf("%lld\n", c[t] - c[s]);
}
}
return 0;
}
这个题目第一个人是需要移除最多k个元素,第二个人就是将数变成负数。所以当变成负数时总数其实是要减去两倍的。所以先将给的数进行排序然后用前缀和去做这个题目。(一开始我用的冒泡排序发现时间超了)如下。然后就改成了归并排序。
#include <stdio.h>
#include <stdlib.h>
int main() {
int tc;
scanf("%d", &tc);
while (tc--)
{
int n, k, x;
scanf("%d %d %d", &n, &k, &x);
int a[200020] = {0};
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for (int i = 1; i <= n; i++)
{
for (int j = i + 1; j <= n; j++)
{
if (a[j] > a[i])
{
int temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
}
for (int i = 1; i <= n; i++)
a[i] += a[i - 1];
int ans = -1e9;
for (int i = 0; i <= k; i++)
{
int min_index = (i + x) > n ? n : (i + x);
int temp = a[n] - 2 * a[min_index] + a[i];
if (temp > ans)
ans = temp;
}
printf("%d\n", ans);
}
return 0;
}
void merge_sort(int q[], int l, int r)
{
if (l >= r) return;
int mid = l + r >> 1;
merge_sort(q, l, mid);
merge_sort(q, mid + 1, r);
int k = 0, i = l, j = mid + 1;
while (i <= mid && j <= r)
if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];
else tmp[k ++ ] = q[j ++ ];
while (i <= mid)
tmp[k ++ ] = q[i ++ ];
while (j <= r)
tmp[k ++ ] = q[j ++ ];
for (i = l, j = 0; i <= r; i ++, j ++ )
q[i] = tmp[j];
}
注意归并排序这里我改了下参数要改一下主函数的参数就行。
然后今天我学了二叉树,知道了前中后以及层序遍历。而且知道了要知道具体的一个二叉树结构需要同时知道中序遍历以及其他三种遍历其中一种。然后知道了这些遍历的具体代码(其实也就是改下顺序)。