前言

这次是我第一次参加算法比赛,很多题也没做到,希望下次能多做一些。

A

打卡题,没啥好说的

B

我的思路

B在我思考了一下,发现+1对数组里面最小的加对整体收益是最大的,所以使用插入排序对整体进行排序,再对最小数+1。

bing 思路

#include <stdio.h>
int main() {
int t;
scanf("%d", &t);
while (t--) {
    int n;
    scanf("%d", &n);
    int a[n];
    for (int i = 0; i < n; ++i) {
        scanf("%d", &a[i]);
    }
    int max_product = 1;
    for (int i = 0; i < n; ++i) {
        if (a[i] == 0) {
            continue;
        }
        int product = 1;
        for (int j = 0; j < n; ++j) {
            if (i == j) {
                product *= a[j] + 1;
            } else {
                product *= a[j];
            }
        }
        if (product > max_product) {
            max_product = product;
        }
    }
    printf("%d\n", max_product);
}
return 0;
}

bing的思路有点没看懂,他如是说到:

这段代码是一个C语言程序,它的作用是读取一些整数,计算它们的乘积,然后输出乘积的最大值。程序首先读取一个整数t,表示测试用例的数量。接下来,对于每个测试用例,程序会读取一个整数n,表示数组a的大小。然后程序会读取n个整数,存储在数组a中。接下来,程序会计算每个元素加1后的乘积(除了当前元素),并将其与当前元素的乘积相比较。如果当前元素的乘积大于最大乘积,则更新最大乘积。最后,程序输出最大乘积。
这段代码中使用了C语言标准库中的函数scanf和printf来读取和输出数据。scanf函数从标准输入流中读取数据,并将其存储在变量中。printf函数将数据格式化为字符串,并将其写入标准输出流中。
在这段代码中,变量t、n、a、max_product、product、i和j都是整型变量。变量t、n和a分别存储测试用例数量、数组大小和数组元素。变量max_product存储最大乘积,变量product存储当前元素加1后的乘积。变量i和j是循环计数器。
这段代码使用了两个for循环来遍历数组a中的所有元素,并计算它们的乘积。外部循环遍历数组a中的所有元素,内部循环计算每个元素加1后的乘积(除了当前元素),并将其与当前元素的乘积相比较。如果当前元素的乘积大于最大乘积,则更新最大乘积。
请注意,在这段代码中,数组a的大小是在运行时动态分配的,因此它必须是一个变长数组(VLA)。这意味着它只能在C99或更高版本中使用。

最后发现有问题,当输入

5

0 0 0 5

时得不到正确答案。

C

在做了的题目里面我耗时最长的就是C了,对于C组题,是一个算靶子中箭得分的题,我用的多个for 循环+if判断,实际可以取横纵坐标与边缘的最小值为分数,这样就会简单很多,例如

#inlcude<stdio.h>
int min(int a, int b){
if (a < b)
    return a;
else
    return b;
}
char s[16][16];
void solve()
{
int i, j, n = 10;
for (i = 0; i < n; i++)
    scanf("%s", s[i]);
int ans = 0;
for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
        if (s[i][j] == 'X')
            ans += min(min(i + 1, 10 - i), min(j + 1, 10 - j));
printf("%d\n", ans);
return;
}
int main()
{
int t;
scanf("%d", &t);
for (; t > 0; t--)
    solve();
return 0;
}

D

https://codeforces.com/contest/1873/problem/D
d就相对简单了,目标是将B变为W需要的次数,唯一要小心的是有肯能用a[]时有溢出,我是将遇到B后将后几位全部变为W再次从头搜索B。

E

https://codeforces.com/contest/1873/problem/E
我用for 循环遍历,结果超时
用嵌套循环遇见数据量小的还好说,数据量大的就会直接超时,做不出来原因还是没有想出好的算法,我后面想用二分法解决,但没想到啥实现办法,贴一个我自己的错误代码

#include<stdio.h>
void m(int b ,int c){
int d[b];
for(int i =0;i<b;i++){
    scanf("%d",&d[i]);//存值
}
int j=0;
int k =0;
for(int i=1;;i++){//for嵌套循环
    k++;
    for(int o = 0;o<b;o++){
        if(d[o]<i)
        j+=i-d[o];
    }
    if(j>c)
    break;
    else j =0;
    
}
printf("%d\n",k-1);
return;
}

int main(){
int p;
scanf("%d",&p);
while (p--)
{
    int b,c;
scanf("%d%d",&b,&c);
m(b,c);
}
}

我看ac有人用二分法做出来了,贴一个

#include<stdio.h>
long long int a[200005];
void solve()
{
long long int n, x;
scanf("%lld %lld", &n, &x);
long long int i;
for (i = 0; i < n; i++)
    scanf("%lld", &a[i]);
long long int min = -1, max = 1e10, mid;
long long int sum;
while (max - min > 1)
{
    mid = (max + min) / 2;
    sum = 0;
    for (i = 0; i < n; i++)
        if (a[i] < mid)
            sum += mid - a[i];
    if (sum <= x)
        min = mid;
    else
        max = mid;
}
printf("%lld\n", min);
return;
}
    int main()
{
    int t;
    scanf("%d", &t);
    for (; t > 0; t--)
    solve();
return 0;
}

这就给我提供了一个二分法的思路,设极小值-1,极大值le10 用max-min>1做判断也真理解到了什么叫不开long long见族宗了,真就学到了,然后我写了一遍,结果不对,看来还是没有完全理解


探索未知