计蒜客普及组模拟赛

今天没事闲的看到计蒜客有个普及组模拟赛,就当练了练手去打了,成绩低的可怜。。。400分崩成280分AK梦想化作泡影

第一题 同学的爱好 链接:https://nanti.jisuanke.com/t/17291

小学应用题难度?大概画个图就能懂,把每个部分都标上号,算出a,b,c,d,e,f的部分,进行运算就行了。

不多解释了,直接上代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int a,b,c,d,e,f,n;
int main(){
    cin>>n;
    cin>>a>>b>>c>>d>>e>>f;
    int x=0,y=0;
    y=d+e+f;
    x=a+b+c-n;
    int ans=0;
    ans=y-x;
    cout<<ans;
    return 0;
}

 

第二题 选秀 链接:https://nanti.jisuanke.com/t/17292

直接从0到1001进行模拟,但是注意魅力值可以是实数,所以有小数可以得到票的情况,开两个数组进行比较(感觉有点多余啊)。最后扫一遍比较最多的票数。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int a[1005],b[1005];
int n,ans,x;
char q[5];
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%s%d",q,&x);
        if(q[0]=='='){a[x]++;b[x]++;}
        if(q[0]=='>'&&q[1]!='='){
            for(int k=x+1;k<=1001;k++){a[k]++;b[k-1]++;}
        }
        if(q[0]=='>'&&q[1]=='='){
            for(int k=x;k<=1001;k++){a[k]++;b[k]++;}
        }
        if(q[0]=='<'&&q[1]!='='){
            for(int k=x-1;k>=0;k--){a[k]++;b[k]++;}
        }
        if(q[0]=='<'&&q[1]=='='){
            for(int k=x;k>=0;k--){a[k]++;b[k]++;}
        }
    }
    for(int i=0;i<=1001;i++){
        ans=max(ans,max(a[i],b[i]));
    }
    cout<<ans;
    return 0;
}

第三题 摘气球 链接:https://nanti.jisuanke.com/t/17293l

排序之后模拟,这题本来a掉的,死在排序气球高度以n长度去排序的。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct child{
    int x,y;
}c[100005];
int n,m;
int a[100005],b[100005];
bool cmp(child a,child b){
    return a.x<b.x;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&c[i].x);
        c[i].y=i;
    }
    int x;
    int k=1;
    for(int i=1;i<=m;i++){
        scanf("%d",&b[i]);
    }
    sort(c+1,c+n+1,cmp);
    sort(b+1,b+m+1);
    for(int i=1;i<=m;i++){
        for(k;k<=n;){
            if(c[k].x>=b[i]){
                a[c[k].y]++;
                break;
                }
            else k++;
            }
        }
    for(int i=1;i<=n;i++){
        cout<<a[i]<<endl;
        }
    return 0;
}

第四题 蒜头君当大厨 链接 :https://nanti.jisuanke.com/t/17294

差分约束(为什么普及组模拟赛要有差分约束啊,话说我前几天才刚看的)

SPFA跑一遍最长路,死于边数开太小re三个点

 

#include<bits/stdc++.h>
#define MAXN 100002
using namespace std;
int read()
{
    int x=0,y=1;char c;c=getchar();
    while(c<'0'||c>'9'){if(c=='-')y=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*y;
}
struct Edge{
    int other,pre,val;
}a[MAXN];
int N,M,cnt,last[MAXN],dis[MAXN],in[MAXN],ans;
bool vis[MAXN];
void connect(int x,int y,int z)
{
    a[++cnt]=(Edge){y,last[x],z};
    last[x]=cnt;
}
bool SPFA()
{
    queue <int> q;
    memset(dis,0xef,sizeof dis);
    vis[0]=1,dis[0]=0,in[0]++;
    q.push(0);
    while(!q.empty())
    {
        int x=q.front();
        q.pop();vis[x]=false;
        for(int i=last[x];i;i=a[i].pre)
        {
            int to=a[i].other;
            if(dis[to]<dis[x]+a[i].val)
            {
                dis[to]=dis[x]+a[i].val;
                if(!vis[to])
                {
                    vis[to]=true;
                    in[to]++;
                    q.push(to);
                    if(in[to]>N)return false;
                }
            }
        }
    }
    return true;
}
int main()
{
    N=read(),M=read();
    for(int i=1;i<=M;i++)
    {
        int op,x,y,z;
        op=read();
        x=read(),y=read();
        if(op<3)
        {
            z=read();
            if(op==2)swap(x,y);
            connect(x,y,z);
        }
        else if(op==3)
            connect(0,x,y);
        else if(op==4)
            connect(x,0,-y);
    } 
    for(int i=1;i<=N;++i)
        connect(0,i,0);
    if(SPFA()){
        for(int i=1;i<=N;i++)ans=max(ans,dis[i]);
        cout<<ans<<endl;
    }
    else cout<<"I can't"<<endl;
    return 0;
}

 

posted @ 2017-09-23 19:50  Elfish?  阅读(418)  评论(0编辑  收藏  举报