“科大讯飞杯”第18届上海大学程序设计联赛春季赛暨高校网络友谊赛A~F题题解

A.组队比赛
枚举法

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include <climits>
int st[2002], gt[2002];
int main()
{
    int a[22], k = 0;
    for (int i = 0; i < 4; i++)
    {
        scanf("%d", &a[i]);
    }
    for (int i = 0; i < 4; i++)
    {
        for (int j = i + 1; j < 4; j++)
        {
            st[k] = a[i] + a[j];//4人选2人组合枚举
            for (int w = 0; w < 4; w++)
            {
                if (w != i && w != j)//另外两人枚举
                {
                    gt[k] += a[w];
                }
            }
            k++;
            //printf("%d\n", st[k - 1]);
        }
    }
    int t = st[0];
    int MIN = 0x3f3f3f3f;
    for (int i = 1; i < k; i++)//比较
    {
        if (fabs(st[i] - gt[i]) < MIN)
        {
            MIN = fabs(st[i] - gt[i]);
        }
    }
    printf("%d\n", MIN);
}

B. 每日一报
结构体,排序规则函数

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<algorithm>
using namespace std;
struct node//题目描述的数据结构
{
    int day;
    int id;
    double temp;
}p[502];
struct cmp//排序规则函数
{
    bool operator()(const node& t1, const node& t2)
    {
        if (t1.day != t2.day)
        {
            return t1.day > t2.day;
        }
        else if (t1.temp != t2.temp)
        {
            return t1.temp > t2.temp;
        }
        return t1.id < t2.id;
    }
};
int main()
{
    int n, a, b, k = 0;
    double c;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d%d%lf", &a, &b, &c);
        if (c < 38)//筛选不正常数据
        {
            continue;
        }
        p[k].day = a, p[k].id = b, p[k++].temp = c;
    }
    sort(p, p + n, cmp());
    printf("%d\n", k);
    for (int i = 0; i < k; i++)
    {
        printf("%d %d %.1lf\n", p[i].day, p[i].id, p[i].temp);
    }
};

C.最长非公共子序列
一开始以为是DP,后来发现只有两种情况,即字符串相同和不同的情况

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
    char p[5005], q[5005];
    scanf("%s%s", p, q);
    if (strcmp(p, q) == 0)//字符串相同
    {
        printf("-1\n");
        return 0;
    }
    printf("%d\n", max(strlen(p), strlen(q)));//字符串不同
}

D.最大字符集
构造题,要求寻找一定长度范围内的所有独立的01字符串集合(即不包含集合内别的字符串的子串)
这波啊,这波是搜索
由于数据范围较小(n<300),且题目限制每种长度的字符串只能有1个,要求得的解空间范围较小( 我们先构造一个初始全为1的字符串
如111111
显然更替0的位置,便能产生不同的独立字符串
如 111110,111101,111011,110111,101111,011111
根据题目要求,每种长度的字符串只能有一种,所以每次搜索我们舍去尾端的1,同时移动0相对于1的位置
即1111111->111110->11101->1011
到达最左端了要怎么构造呢?毕竟n>2时的字符串数达到n-1才能达到理论最大值,因为0和1必然是别的字符串的子串。
我们可以在一个字符串里使用两个0继续构造,两个0使字符串灵活了许多,构造便容易多了。
如:
011110->01110->0110->010->00
这种构造方式容易实现
所以我们在第一次搜索搜不动时,使用第二次搜索。

// An highlighted block
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void dfs2(int len)//第一次构造无法继续时开始第二种构造法
{
    if (len < 2)
        return;
    printf("0");
    for (int i = i = 0; i < len - 2; i++)
    {
        printf("1");
    }
    printf("0\n");
    dfs2(len - 1);
}
void dfs(int len, int pos, int count)
{
    if (count > len)//0的数量要求比字符串还长时返回
    {
        return;
    }
    for (int i = 0; i < len; i++)//构造字符串
    {
        if (i == pos)
        {
            int j;
            for (j = 0; j < count; j++)
            {
                printf("0");
            }
            i += j - 1;
            continue;
        }
        printf("1");
    }
    printf("\n");
    if (pos > 1)
    {
        dfs(len - 1, pos - 2, count);//字符串长度-1,0的位置左移2位
    }
    else dfs2(len - 1);//0的位置使搜索不能再继续了,开始第二次搜索
}
int main()
{
    int n;
    scanf("%d", &n);
    if (n < 3)
    {
        printf("%d\n", n);
    }
    else printf("%d\n", n - 1);
    dfs(n, n, 1);//字符串长度,0的位置(此刻没有0),0的数量
}

E. 美味的序列
贪心,优先选择数值大的数据,这样能带来更大利润

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<algorithm>
using namespace std;
int a[100005];
int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    sort(a, a + n);
    int count = 0;
    long long sum = 0;
    for (int i = 0; i < n; i++)
    {
        sum += a[i] - count;
        count++;
    }
    printf("%lld\n", sum);
}

F. 日期小助手
模拟,日期类问题要注意闰年处理,分类讨论,以及求第几个星期几时的日期循环处理

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int moon[3000];
int fa[3000];
int main()
{
    moon[2000] = 14;
    for (int i = 2001; i <= 2100; i++)//求母亲节日期
    {
        if (!(i % 4 == 0 && i % 100 != 0))
        {
            moon[i] = moon[i - 1] - 1;
            if (moon[i] == 7)
                moon[i] = 14;
        }
        else {
            moon[i] = moon[i - 1] - 2;
            if (moon[i] == 7)
                moon[i] = 14;
            if (moon[i] == 6)
                moon[i] = 13;
        }
    }
    fa[2000] = 18;
    for (int i = 2001; i <= 2100; i++)//求父亲节日期
    {
        if (!(i % 4 == 0 && i % 100 != 0))
        {
            fa[i] = fa[i - 1] - 1;
            if (fa[i] == 14)
                fa[i] = 21;
        }
        else {
            fa[i] = fa[i - 1] - 2;
            if (fa[i] == 14)
                fa[i] = 21;
            if (fa[i] == 13)
                fa[i] = 20;
        }
    }
    int n, a, b, c;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d%d%d", &a, &b, &c);//注意日期下标
        if (b < 5 || b == 5 && c < moon[a])
        {
            if (moon[a] == 1 || moon[a] == 21 || moon[a] == 31)
                printf("Mother's Day: May %dst, %d\n", moon[a], a);
            else if (moon[a] == 2 || moon[a] == 22)
                printf("Mother's Day: May %dnd, %d\n", moon[a], a);
            else if (moon[a] == 3 || moon[a] == 23)
                printf("Mother's Day: May %drd, %d\n", moon[a], a);
            else printf("Mother's Day: May %dth, %d\n", moon[a], a);
        }
        else if (b > 6 || b == 6 && c >= fa[a])
        {
            if (moon[a + 1] == 1 || moon[a + 1] == 21 || moon[a + 1] == 31)
                printf("Mother's Day: May %dst, %d\n", moon[a + 1], a + 1);
            else if (moon[a + 1] == 2 || moon[a + 1] == 22)
                printf("Mother's Day: May %dnd, %d\n", moon[a + 1], a + 1);
            else if (moon[a + 1] == 3 || moon[a + 1] == 23)
                printf("Mother's Day: May %drd, %d\n", moon[a + 1], a + 1);
            else printf("Mother's Day: May %dth, %d\n", moon[a + 1], a + 1);
        }
        else {
            if (fa[a] == 1 || fa[a] == 21 || fa[a] == 31)
                printf("Father's Day: June %dst, %d\n", fa[a], a);
            else if (fa[a] == 2 || fa[a] == 22)
                printf("Father's Day: June %dnd, %d\n", fa[a], a);
            else if (fa[a] == 3 || fa[a] == 23)
                printf("Father's Day: June %drd, %d\n", fa[a], a);
            else printf("Father's Day: June %dth, %d\n", fa[a], a);
        }
    }
}

你可能感兴趣的:(acm)