前言
这次是我第一次参加算法比赛,很多题也没做到,希望下次能多做一些。
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见族宗了,真就学到了,然后我写了一遍,结果不对,看来还是没有完全理解