Bytedance 实习 测试岗 2023.6

丢西瓜捡芝麻策略

解法一:直接从起点开始走,遇到比手上有的物品价格低的就换成买价格低的物品,直到终点,这样就能确保买到的价格最低。算法的时间复杂度为 $O(n)$。

 1#include <stdio.h>
 2#include <string.h>
 3#include <stdlib.h>
 4#define MAX 100
 5
 6typedef struct Expense
 7{
 8	long int day;
 9	long int cost;
10};
11
12int main()
13{
14	Expense arr[MAX];
15	long int min_cost = 1e9 + 7;
16	int k = 0;
17    long long int M, N, ans = 0;
18	memset(arr, 0, sizeof(arr));
19	scanf("%lld%lld", &M, &N);
20    for (int i = 0; i < N; i++)
21	{
22        scanf("%ld%ld", &arr[i].day, &arr[i].cost);
23	}
24	for (int i = 0; i < N; i++)
25	{
26		if (arr[i].cost < min_cost)
27		{
28			ans += arr[k].cost * (arr[i].day - arr[k].day);
29			k = i;
30			min_cost = arr[i].cost;
31		}
32	}
33	ans += arr[k].cost * (M - arr[k].day);
34	printf("%lld\n", ans);
35    return 0;
36}

解法二(贪心算法+计数排序):先用计数排序从小到大排好各个补给站的物品价格,先选最小的物品价格作为起点,然后在该物品的补给站之前找到最小的物品价格,如此迭代,直到回到起点为止,这样取得的同样是最小的花费。算法时间复杂度为 $O(m*n)$

 1#include <stdio.h>
 2#include <stdlib.h>
 3#include <string.h>
 4#define MAX 10000
 5
 6typedef struct Travel
 7{
 8	long int day;
 9	long int cost;
10}Expense;
11
12
13void print_arr(Expense* arr, int n) //打印排序结果
14{
15    int i;
16    printf("%d", arr[0].cost);
17    for (i = 1; i < n; i++)
18    {
19        printf(" %d", arr[i].cost);
20    }
21    printf("\n");
22}
23
24int main()
25{
26	long long int M, N;
27    int* count_arr = (int*)malloc(sizeof(int) * MAX);
28
29    memset(count_arr, 0, MAX);
30	scanf("%lld%lld", &M, &N);
31    Expense* sorted_arr = (Expense*)malloc(sizeof(Expense) * N);
32    Expense* arr = (Expense*)malloc(sizeof(Expense) * N);
33    for (int i = 0; i < N; i++)
34    {
35        arr[i].cost = arr[i].day = 0;
36    }
37	for (int i = 0; i < N; i++)
38	{
39        int j = scanf("%ld%ld", &arr[i].day, &arr[i].cost);
40        if (j == 2) //计数排序
41        {
42            count_arr[arr[i].cost]++;
43        }
44		while (char ch = getchar() != '\n');
45	}
46    print_arr(arr, N);
47    for (int k = 1; k < MAX; k++)//累加次数
48    {
49        count_arr[k] += count_arr[k - 1];
50    }
51    for (int j = N; j > 0; j--)
52    {
53        sorted_arr[--count_arr[arr[j - 1].cost]] = arr[j - 1];
54    }
55    print_arr(sorted_arr, N);
56    int k = 0;
57    long int remain_day = M, day = sorted_arr[k].day;
58    long long int total_cost = 0;
59    do
60    {
61        total_cost += (remain_day - sorted_arr[k].day) * sorted_arr[k].cost;
62        for (int i = 0; i < N; i++)
63        {
64            if (sorted_arr[i].day < sorted_arr[k].day)
65            {
66                day = sorted_arr[k].day;
67                remain_day = sorted_arr[k].day;
68                k = i;
69                break;
70            }
71        }
72    } while (sorted_arr[k].day != 0);
73    total_cost += day * sorted_arr[k].cost;    
74    printf("%lld", total_cost);
75    free(arr);
76    free(count_arr);
77    free(sorted_arr);
78	return 0;
79}

计数排序参考: