2020.01-月赛题解

creatorping 2021-01-04 15:50:38 2021-01-05 10:56:01

一.细胞扩张

  • 数一数,输出细胞个数即可

二.学习负数

printf("%s\n",x>y?"Yes":"No");

三.d的单词个数

  • 循环判断即可
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
char str[100100];
int main()
{
    int ans=0;
    gets(str);
    int len=strlen(str);
    str[len] = ' ';
    for(int i=1;i<=len;i++)
    {
        if(str[i]==' '&&str[i-1]=='d')
        {
            ans++;
        }
    }
    printf("%d\n",ans);
}

四.食堂跑腿

  • 前两个食堂的菜品价格两两相加,前两个食堂的价格的所有可能放到一个map容器种,第三个食堂遍历的时候,直接加上前两个食堂的可能数
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<map>
using namespace std;
map<int,int> mp;
int a[1100];
int main()
{
    int m,k,x,ans=0;
    cin>>m>>k;
    for(int i=1;i<=m;i++)
        cin>>a[i];
    for(int i=1;i<=m;i++)
    {
        cin>>x;
        for(int j=1;j<=m;j++)
        {
            mp[x+a[j]]++;
        }
    }
    for(int i=1;i<=m;i++)
    {
        cin>>x;
        ans+=mp[k-x];
    }
    printf("%d\n",ans);
}

五.公司招聘

  • 创建一个超级源点,连接所有员工,超级源点连接员工的价格为员工的原价,然后走一遍最小生成树模板。
int n,m,tot;
int f[10010];
struct node
{
    int x,y,v;
} A[1100000];
void init()
{
    for(int i=0; i<=n; i++)
        f[i]=i;
    tot=0;
}
void add(int x,int y,int v)
{
    A[tot].x=x;
    A[tot].y=y;
    A[tot++].v=v;
}
int cmp(node a,node b)
{
    return a.v<b.v;
}
int find(int x)
{
    if(x!=f[x])
        f[x]=find(f[x]);
    return f[x];
}
int main()
{
    int x,y,v;
    FILE *r=fopen("2.in","r");
    FILE *ff=fopen("2.out","w");
    while(~fscanf(r,"%d%d",&n,&m))
    {
        init();
        for(int i=1; i<=n; i++)
        {
            fscanf(r,"%d",&v);
            add(0,i,v);
        }
        for(int i=1; i<=m; i++)
        {
            fscanf(r,"%d%d%d",&x,&y,&v);
            add(x,y,v);
        }
        sort(A,A+tot,cmp);
        int ans=0;
        for(int i=0; i<tot; i++)
        {
            int p1=find(A[i].x);
            int p2=find(A[i].y);
            if(p1!=p2)
            {
                f[p1]=p2;
                ans+=A[i].v;
            }
        }
        fprintf(ff,"%d\n",ans);
    }
    fclose(r);
    fclose(ff);
}

六.过公路

  • 最短路径的变形,改一下松弛条件就可以了
#include<string.h>
#include<stdio.h>
#include<queue>
#include<math.h>
#define inf 0x3f3f3f3f
using namespace std;
const int N=303;
const int M=5e4+10;
int m,n,st,en,tot,head[N],dis[N];
bool vis[N];
struct node
{
    int v,dis,a,b,net;
} e[M];
void add(int aa,int bb,int cc,int dd,int ee)
{
    e[tot].v=bb;
    e[tot].dis=cc;
    e[tot].a=dd;
    e[tot].b=ee;
    e[tot].net=head[aa];
    head[aa]=tot++;
}
int dij()
{
    int time=0;
    memset(dis,0x3f,sizeof(dis));
    memset(vis,false,sizeof(vis));
    dis[st]=0;
    for(int i=1; i<=n; i++)
    {
        int u=-1,tmp=inf;
        for(int j=1; j<=n; j++)
        {
            if(!vis[j]&&dis[j]<tmp)
            {
                tmp=dis[j];
                u=j;
            }
        }
        if(u==-1) break;
        vis[u]=true;
        for(int j=head[u]; j!=-1; j=e[j].net)
        {
            int aa=e[j].a,bb=e[j].b,dist=e[j].dis;
            int t=dis[u]%(aa+bb);
            int v=e[j].v;
            if(aa<dist) continue;
            if(aa-t>=dist&&dis[v]>dis[u]+dist)
            {
                dis[v]=dis[u]+dist;
                time+=dist;
            }
            else if(aa-t<dist&&dis[v]>dis[u]+dist+aa-t+bb)
            {
                dis[v]=dis[u]+dist+aa-t+bb;
            }
        }
    }
    return dis[en];
}
int main()
{
    int u,v,dis,aa,bb,k=1;
    while(~scanf("%d%d%d%d",&n,&m,&st,&en))
    {
        tot=0;
        memset(head,-1,sizeof(head));
        for(int i=0; i<m; i++)
        {
            scanf("%d%d%d%d%d",&u,&v,&aa,&bb,&dis);
            add(u,v,dis,aa,bb);
        }
        printf("%d\n", dij());
    }
}

恭喜以下选手

AMAZE UI
Hello world!