西山居 初赛

本文深入探讨了三个不同难度级别的算法题目,涵盖了从简单水题到更具挑战性的比赛难题。通过详细解析代码实现,作者分享了解决问题的策略和思考过程,旨在提升读者的编程技能和解决复杂问题的能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一题: 魔法串  水题,贴代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <string>
#define LL long long
#define DB double
using namespace std;
const int N = 1009;
char a[N],b[N];
int v[39][39];
vector<int> L[39];
queue<int> que;
void init()
{
    memset(v,0,sizeof(v));
    for(int i=0;i<26;i++)
    {
        v[i][i] = 1;
        while(!que.empty()) que.pop();
        que.push(i);
        while(!que.empty())
        {
            int e = que.front();que.pop();
            for(int j=0;j<(int)L[e].size();j++)
            {
                int to = L[e][j];
                if(v[i][to]==0)
                {
                    v[i][to] = 1;
                    //que.push(to);
                }
            }
        }
    }
}
int A[N],B[N];
int solve()
{
    int l1 = strlen(a),l2=strlen(b);
    for(int i=0;i<l1;i++) A[i] = a[i]-'a';
    for(int j=0;j<l2;j++) B[j] = b[j]-'a';
    for(int i=0,j=0;i<l1;i++)
    {
        int f = 0;
        for(;j<l2;)
        {
            if(v[B[j]][A[i]])
            {
                j++;
                f = 1;break;
            }
            j++;
        }
        if(!f) return 0;
    }return 1;
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    #endif
    int cas,T=1;scanf("%d",&cas);
    while(cas--)
    {
        scanf("%s%s",a,b);
        int m;
        scanf("%d",&m);
        for(int i=0;i<36;i++) L[i].clear();
        while(m--)
        {
            char c1[3],c2[3];
            scanf("%s%s",c1,c2);
            L[c1[0]-'a'].push_back(c2[0]-'a');
        }
        init();
        printf("Case #%d: %s\n",T++,solve()?"happy":"unhappy");//solve()
    }
    return 0;
}

第二题:比赛难度 随便搞搞,怎么搞都能过.


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <string>
#define LL long long
#define DB double
using namespace std;
const int N = 10009;
struct nod{
    int val1,val2,p;
    bool operator<(const nod t) const
    {
        return val1>t.val1||(val1==t.val1&&val2>t.val2);
    }
};
priority_queue<nod> que;
int re[N];
int n,m;
int solve()
{
    sort(re,re+n);
    re[n] = 0x3f3f3f3f;
    nod e,t;
    while(!que.empty()) que.pop();
    e.p =0;e.val1 = re[0];
    e.val2 =0;
    que.push(e);
    for(int i=1;i<m;i++)
    {
        e = que.top();que.pop();
        int p = e.p +1;
        t.p = p;
        t.val1 = e.val2+re[p];
        t.val2 = e.val2;
        que.push(t);
        t.val1 = e.val1+re[p];
        t.val2 = e.val1;
        que.push(t);
    }e = que.top();
    return e.val1;
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    #endif
    int cas,T=1;scanf("%d",&cas);
    while(cas--)
    {
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++) scanf("%d",&re[i]);
        printf("Case #%d: %d\n",T++,solve());
    }
    return 0;
}

第三题:  不会...好伤心..

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值