IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 4/23 18届浙江省赛 -> 正文阅读

[数据结构与算法]4/23 18届浙江省赛

--------------------省赛入口------------------------

String Freshman

对于子串T,去匹配S的时候,若出现字母被重复利用,那么匹配S得到的答案肯定是错的;
只有当子串T的字母都不和首字母相同时,匹配主串时才能相同。
另一种思路:
用kmp算法求子串的最长公共前后缀。

#include <bits/stdc++.h>

using namespace std;
int m,p[100005];
char s[100005];
void pre()
{
    p[1]=0;int j=0;
    for(int i=1;i<m;i++)
    {
        while(j>0&&s[j+1]!=s[i+1])
            j=p[j];
        if(s[i+1]==s[j+1])
            j++;
        p[i+1]=j;
    }
}
int main()
{
    cin>>m;
    cin>>(s+1);
    pre();
    int flag=0;
    for(int i=1;i<=m;i++)
    {
        if(p[i])
        {
            flag=1;break;
        }
    }
    if(flag)
        cout<<"Wrong Answer"<<endl;
    else
        cout<<"Correct"<<endl;
    return 0;
}

A. Transformation: from A to B

没想到只是个1000难度的搜索题而已。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll a,b,ans,path[1005];
bool flag;
void dfs(ll x,ll step)
{
    path[step]=x;
    if(x==b)
    {
        cout<<"YES"<<endl;
        flag=1;
        cout<<step<<endl;
        for(int i=1;i<=step;i++)
        {
            cout<<path[i]<<" ";
        }
        cout<<endl;
        return;
    }
    if(x>b)
        return;
    dfs(x*2,step+1);
    dfs(x*10+1,step+1);
}
int main()
{
    cin>>a>>b;
    dfs(a,1);
    if(!flag)
    {
        cout<<"NO"<<endl;
    }
    return 0;
}

J. Grammy and Jewelry

坏习惯的弊端还是显现出来了。
平常数组都开的很大,不会去注意空间的倍数关系,最后自己都忘了。

#include <bits/stdc++.h>

using namespace std;
const int inf=0x3f3f3f3f;
const int N=6100;
int n,m,t,a[N],head[N],cnt,dist[N],dp[N];
bool vis[N];
struct node
{
    int to,nxt,dis;
}e[N];
void add(int from,int to)
{
    e[++cnt].to=to;
    e[cnt].dis=1;
    e[cnt].nxt=head[from];
    head[from]=cnt;
}
struct nd
{
    int id,dis;
    bool operator<(const nd &a)const
    {
        return a.dis<dis;
    }
};
void dij()
{
    priority_queue<nd>q;
    q.push(nd{1,0});
    for(int i=1;i<=n;i++)
        dist[i]=inf;
    dist[1]=0;
    while(!q.empty())
    {
        nd u=q.top();q.pop();
        int now=u.id;
        if(vis[now]) continue;
        vis[now]=1;
        for(int i=head[now];i;i=e[i].nxt)
        {
            int v=e[i].to;
            if(dist[v]>dist[now]+e[i].dis)
            {
                dist[v]=dist[now]+e[i].dis;
                if(!vis[v]) q.push(nd{v,dist[v]});
            }
        }
    }
}
signed main()
{
    cin>>n>>m>>t;
    for(int i=2;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=m;i++)
    {
        int u,v;cin>>u>>v;
        if(u==v) continue;
        add(u,v);add(v,u);
    }
    dij();
    for(int i=2;i<=n;i++) dist[i]*=2;
    for(int i=2;i<=n;i++)
        for(int j=dist[i];j<=t;j++)
        {
            dp[j]=max(dp[j],dp[j-dist[i]]+a[i]);
        }
    for(int i=1;i<=t;i++)
        cout<<dp[i]<<" ";
    cout<<endl;
    return 0;
}

F. Fair Distribution

这个题真的要静下心好好想。
从分配机器人的数目,和每个机器人的能量数考虑。
一共20个能量数:
如果每个机器人分配3个,那么只需要7个机器人就可以;如果分配给8个,势必会增加权值;
如果6个机器人每人要分配4个,但在此情况下(20个能量棒),分配给5个机器人最佳。
同理:
观察
7 20
7 22
两组样例会发现巧妙之处。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
ll n,ans;
double m;
int main()
{
    ll t;
    scanf("%lld",&t);
    while(t--)
    {
        scanf("%lld%lf",&n,&m);
        if(n>m)
        {
            printf("%lld\n",(ll)(n-m));
            continue;
        }
        ll x=ceil(m/n); //每个机器人分配的能量数目
        ans=inf;
        while(1)
        {
            ll y=ceil(m/x); //分给多少个机器人
            ans=min(ans,(ll)(n-y+x*y-m));
            if(y==1)
                break;
            x=ceil(m/(y-1)); //分给的机器人数目减一
        }
        printf("%lld\n",ans);
    }
    return 0;
}

C. Cube

今年再做这个题,用stl容器真的得心应手起来了。

#include <bits/stdc++.h>

using namespace std;
const int N = 1e5+100;
struct node
{
    int x,y,z;
}e[15];
set<int>s;
int main()
{
    int t;cin>>t;
    while(t--)
    {
        s.clear();
        for(int i=1;i<=8;i++)
            cin>>e[i].x>>e[i].y>>e[i].z;
        int falg=0;
        for(int i=1;i<=8;i++)
        {
            for(int j=1;j<=8;j++)
            {
                if(i==j)
                    continue;
                int temp=(e[i].x-e[j].x)*(e[i].x-e[j].x)+(e[i].y-e[j].y)*(e[i].y-e[j].y)+(e[i].z-e[j].z)*(e[i].z-e[j].z);
                if(temp==0)
                    falg=1;
                s.insert(temp);
            }
        }
        int ans=s.size();
        if(falg||ans!=3)
            cout<<"NO"<<endl;
        else if(ans==3)
            cout<<"YES"<<endl;
    }
    return 0;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-24 09:40:34  更:2022-04-24 09:42:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:48:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码