2025年百度之星初赛第二场 T4 & 失败的T8
失败的 T4 (TLE)
沃趣啊刚拿到题一半考图论一半考数论。
gcd?辗转相除也忘了,直接在循环里按 1 步进吧。字典序遍历早忘了。代码很暴力还写半天。
果不其然 TLE 了。貌似 n = 9 往上就很慢了。
#include<stdio.h>
int n, max;
int p[100010];
int object[100010];
int supsum(int n)
{
int sum = 1;
for (int i = 1; i <= n; i++)
{
sum = sum * n;
}
return sum;
}
int min(int* p, int n)
{
int min;
min = p[1];
for (int i = 2; i <= n; i++)
{
if (min > i * p[i])
{
min = i * p[i];
}
}
return min;
}
int gcd(int* p, int n)
{
int flag = 0;
int minnum = min(p, n);
int gcd = minnum;
while (gcd >= 1)
{
for (int j = 1; j <= n; j++)
{
if (j * p[j] % gcd != 0)
{
break;
}
if (j == n && j * p[j] % gcd == 0)
{
flag = 1;
}
}
if (flag)
{
return gcd;
}
gcd--;
}
}
void step(int* p, int n)
{
int t;
int sel;
for (int i = n; i >= 2; i--)
{
if (p[i] < p[i - 1])
{
continue;
}
for (int j = n; j >= i; j--)
{
if (p[j] > p[i - 1])
{
sel = j;
break;
}
}
t = p[sel];
p[sel] = p[i - 1];
p[i - 1] = t;
for (int j = 0; j <= (n - i + 1) / 2 - 1; j++)
{
t = p[n - j];
p[n - j] = p[i + j];
p[i + j] = t;
}
return;
}
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= 100000; i++)
{
p[i] = i;
}
max = -1;
int maxfor = supsum(n) - 1;
for (int i = 1; i <= maxfor; i++)
{
if (gcd(p, n) > max)
{
for (int j = 1; j <= n; j++)
{
object[j] = p[j];
}
max = gcd(p, n);
}
if (i == maxfor)
{
break;
}
step(p, n);
}
for (int i = 1; i <= n; i++)
{
printf("%d ", object[i]);
}
return 0;
}
用这个程序往里代了几个数找规律,woc,原来有什么规律吗。
蛮力是这样的,所以要好好学数论。
成功的 T4
#include<stdio.h>
int n;
int main()
{
scanf("%d", &n);
if (n % 2 == 1)
{
for (int i = 1; i <= n; i++)
{
printf("%d ", i);
}
}
else
{
for (int i = 1; i <= n/2; i++)
{
for (int j = 0; j <= 1; j++)
{
printf("%d ", i * 2 - j);
}
}
}
return 0;
}
错误的 T8 (WA)
貌似是贪心。
只剩三十来分钟了,慌慌张张一轮乱敲,整出了个大概。
果不其然,考试结束前刚过编译,出的结果都是错的。
代码写成依托史了。
#include <stdio.h>
int t, n, x, y, max1, min1;
int cnt1, cnt2;
int cost;
int sum;
int maxa, maxb;
int flag;
int maxt;
int a[200010];
int step1(int* a, int n, int* maxt)
{
int max = -1;
int mincnt = 0;
int min = 1000000001;
for (int i = 1; i <= n; i++)
{
if (a[i] > max)
{
max = a[i];
}
if (a[i] < min)
{
min = a[i];
}
}
if (max == min)
{
return -1;
}
for (int i = 1; i <= n; i++)
{
if (a[i] == min)
{
mincnt++;
a[i] = max;
}
}
*maxt = max;
return mincnt;
}
int check(int* a, int n)
{
for (int i = 1; i <= n-1; i++)
{
if (a[i] = a[i + 1])
{
continue;
}
return 1;
}
return 0;
}
int step2(int* a, int n, int* maxt)
{
int min=1000000001, maxcnt=0;
for (int i = 1; i <= n; i++)
{
if (a[i] < min)
{
min = a[i];
}
}
if (*maxt == min)
{
return -1;
}
for (int i = 1; i <= n; i++)
{
if (a[i] == *maxt)
{
maxcnt++;
a[i]--;
}
}
*maxt = (*maxt)--;
return maxcnt;
}
int main()
{
scanf("%d", &t);
for (int i = 1; i <= t; i++)
{
max1 = -1;
min1 = 1000000001;
scanf("%d %d %d", &n, &x, &y);
for (int j = 1; j <= n; j++)
{
scanf("%d", &a[i]);
if (a[i] > max1)
{
max1 = a[i];
}
if (a[i] < min1)
{
min1 = a[i];
}
}
sum = 1000000001;
flag = 0;
for (int i = 0;; i++)
{
cost = 0;
int j = 0;
int k = 0;
while (j < i)
{
cnt1 = step1(a, n, &maxt);
if (cnt1 == -1)
{
if (sum > cost)
sum = cost;
flag = 1;
break;
}
else
{
cost = cost + cnt1 * x;
}
j++;
}
if (flag == 1)
{
break;
}
while (1)
{
cnt2 = step2(a, n, &maxt);
if (cnt2 == -1)
{
if (sum > cost)
sum = cost;
break;
}
else
{
cost = cost + cnt2 * y;
}
}
}
printf("%d", sum);
}
return 0;
}
浙公网安备 33010602011771号