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;
}

posted on 2025-08-10 18:53  汐寻  阅读(26)  评论(0)    收藏  举报