2018年内蒙古自治区第十三届大学生程序设计竞赛题解

2019.03.13更新:补充G题及以后的AC代码,题解日后补充。


A.内蒙创业

题目链接:https://www.bttcacm.cn/problem.php?id=1021

简单判断是否符合条件即可

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        char a[100];
        cin>>a;
        int flag=1;
        if(a[0]!='L' || a[1]!='Q')
            flag=0;
        if(strlen(a)!=10)
            flag=0;
        for(int i=2;i<10;i++)
            if(a[i]<'0' || a[i]>'9')
                flag=0;
        if(flag)
            cout<<"YES\n";
        else
            cout<<"NO\n";
    }
    return 0;
}

B.涮羊肉

题目链接:https://www.bttcacm.cn/problem.php?id=1022

首先处理出所有肉变得美味的时刻,对它们从小到大排序,使用贪心策略,一旦可以捞肉就捞。这样就可以使每次可以捞肉的起始时间尽量早。

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int main(){
    int t;
    while(cin>>t){
        int a[5000];
        bool vis[5000];
        while(t--){
            memset(a,0,sizeof(a));
            memset(vis,0,sizeof(vis));
            int n,m;
            cin>>n>>m;
            for(int i=0;i<n; i++){
                int x,y;
                cin>>x>>y;
                a[i] = x+y;
            }
            sort(a,a+n);
            int sum = 0;
            for(int i=a[0]; i<=a[n-1]; i++){
                for(int j=0; j<n; j++){
                    if(i == a[j] && !vis[a[j]]){
                        vis[a[j]] = 1;
                        sum++;
                        i+=m;
                    }
                }
            }
            cout<<sum<<endl;
        }
    }
    return 0;
}

C.狙击敌人

题目链接:https://www.bttcacm.cn/problem.php?id=1023

判断斜率和方向即可

#include<iostream>
#include<cstring>
#include<string>
#include<math.h>
using namespace std;

int sgn(int x){
    return x<0?x==0?0:1:-1;
}

int main(){
    int t;
    while(cin>>t){
        while(t--){
            int flag=1;
            int x1,y1,x2,y2,dx,dy;
            cin >> x1 >> y1 >> x2 >> y2 >> dx >> dy;
            if((x2-x1)*(dy)-(y2-y1)*(dx)!=0)
                flag=0;
            if(sgn(dx)!=sgn(x2-x1) || sgn(dy)!=sgn(y2-y1))
                flag=0;
            if(flag)
                cout << "YES" << '\n';
            else
                cout << "NO" << '\n';
        }
    }
    return 0;
}

D.医疗兵

题目链接:https://www.bttcacm.cn/problem.php?id=1024

动态规划,有七种转移:

  1. 用1个医疗包
  2. 用1个医疗包和1个饮料
  3. 用1个饮料
  4. 用2个饮料
  5. 用3个饮料
  6. 用4个饮料
  7. 什么都不用

特别感谢:武耗子

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAX(a,b,c,e,d,f,g) max(a,max(b,max(c,max(d,max(e,max(f,g))))))
#define _INF -0x7fffffff
using namespace std;
int dp[105][105][105];
int que[105];
int n;
int t;
int main(){
    cin>>t;
    while(t--){
        int a,b;
        memset(dp,0,sizeof(dp));
        memset(que,0,sizeof(que));
        scanf("%d%d%d",&a,&b,&n);
        for(int i=1;i<=n;++i)
            scanf("%d",&que[i]);
        for(int i=0;i<=a;++i)
        for(int j=0;j<=b;++j)
            dp[0][i][j]=100;
        int t=0,ans=0;
        for(int i=1;i<=n;++i){
            int c=t;
            for(int j=0;j<=a;++j){
                for(int k=0;k<=b;++k){
                    dp[i][j][k]=MAX(
                        dp[i-1][j][k]-que[i],
                        (j>0&&dp[i-1][j-1][k]>0&&dp[i-1][j-1][k]<=70)? 70-que[i]:_INF,
                        (dp[i-1][j-1][k-1]>0&&j>0&&k>0&&dp[i-1][j-1][k-1]<=70)? 100-que[i]:_INF,
                        (k>0&&dp[i-1][j][k-1]>0)? (dp[i-1][j][k-1]>70? 100-que[i]:dp[i-1][j][k-1]+30-que[i]):_INF,
                        (k>1&&dp[i-1][j][k-2]>0)? (dp[i-1][j][k-2]>40? 100-que[i]:dp[i-1][j][k-2]+60-que[i]):_INF,
                        (k>2&&dp[i-1][j][k-3]>0)? (dp[i-1][j][k-3]>10? 100-que[i]:dp[i-1][j][k-3]+90-que[i]):_INF,
                        (k>3&&dp[i-1][j][k-4]>0)? (100-que[i]):_INF
                    );
                    if(dp[i][j][k]>0)t++;
                }
            }
            if(c!=t)ans=max(ans,i);
        }
        cout<<ans<<endl;
    }
    return 0;
}

E.逃离机场

题目链接:https://www.bttcacm.cn/problem.php?id=1025

BFS

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
struct step
{
    int r,c;
    int time;
    step(int a,int b, int cc):
        r(a),c(b),time(cc){}
    step(){};
};
queue <step> q;
int b[4][2] = {0,-1,0,1,1,0,-1,0};
step start;
int main()
{
    int t;
    while(cin>>t)
    {
        while(t--)
        {
            char s[210][210];
            bool vis[210][210];
            int n,m;
            cin>>n>>m;
            memset(s,'#',sizeof(s));
            memset(vis,0,sizeof(vis));
            while(!q.empty())
                q.pop();
            for(int i=1; i<=n; i++)
            {
                for(int j=1; j<=m; j++)
                {
                    cin>>s[i][j];
                    if(s[i][j] == '@')
                        start = step(i,j,0);
                }
            }
            //cout<<endl<<endl;
            for(int i=1; i<=n; i++)
            {
                for(int j=1; j<=m; j++)
                {
                    if(s[i][j] == 'o')
                    {
                       for(int k=i;k>=1;k--)
                       {
                           if(s[k][j]=='x')
                            break;
                           if(s[k][j]=='.'||s[k][j]=='@')
                            s[k][j]='O';
                       }
                       for(int k=i;k<=n;k++)
                       {
                           if(s[k][j]=='x')
                            break;
                           if(s[k][j]=='.'||s[k][j]=='@')
                            s[k][j]='O';
                       }
                       for(int k=j;k>=1;k--)
                       {
                           if(s[i][k]=='x')
                            break;
                           if(s[i][k]=='.'||s[i][k]=='@')
                            s[i][k]='O';
                       }
                       for(int k=j;k<=m;k++)
                       {
                           if(s[i][k]=='x')
                            break;
                           if(s[i][k]=='.'||s[i][k]=='@')
                            s[i][k]='O';
                       }
                    }
                }
            }
            bool flag = 0;
            for(int i=1; i<=n; i++)
                for(int j=1; j<=m; j++)
                    if(s[i][j] == '@')
                        flag = 1;
            if(!flag)
            {
                cout<<"no zuo no die!"<<'\n';
                continue ;
            }
            /*for(int i=1; i<=n; i++)
            {
                for(int j=1; j<=m; j++)
                {
                    cout<<s[i][j];
                }
                cout<<endl;
            }
            cout<<endl<<endl;*/
            q.push(start);
            vis[start.r][start.c] = 1;
            step ps;
            while(!q.empty())
            {
                ps = q.front();
                if(s[ps.r][ps.c] == '#')
                {
                    break;
                }
                q.pop();
 
                for(int k=0; k<4; k++)
                {
                    int r = ps.r + b[k][0], c = ps.c + b[k][1];
                    if(s[r][c] == 'o' || s[r][c] == 'O' || s[r][c] == 'x')
                        continue ;
                    if(!vis[r][c] )
                    {
                        q.push(step(r,c,ps.time+1));
                        vis[r][c] = 1;
                    }
                }
            }
            if(q.empty())
                cout<<"no zuo no die!"<<'\n';
            else
                cout<<ps.time<<'\n';
        }
    }
    return 0;
}

F.洗衣服

题目链接:https://www.bttcacm.cn/problem.php?id=1026

模拟

#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
 
int main(){
    int T;
    while(scanf("%d",&T)!=EOF){
        while(T--){
            int n,m;
            scanf("%d%d",&n,&m);
            int ti[150];
            memset(ti,0,sizeof(ti));
            int q[1500];
            for(int u=0;u<m;u++){
                scanf("%d",&q[u]);
            }
            int head=0;
            int i;
            for(i=0;;i++){
                for(int j=0;j<n;j++){
                    if(q[head]<=i && ti[j]==i && head<m){
                        ti[j]+=45;
                        head++;
                    }
                }
                int flag=1;
                for(int j=0;j<n;j++){
                    if(ti[j]>i)
                        flag=0;
                }
                for(int j=0;j<n;j++){
                    if(ti[j]==i)
                        ti[j]=i+1;
                }
                if(flag==1 && head==m)
                    break;
            }
            printf("%d\n",i);
        }
    }
    return 0;
}

G.哥本哈根妖

题目链接:https://www.bttcacm.cn/problem.php?id=1027

#include<math.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;
double const exp1=0.0000000001;
struct node
{
    int x;
    double t,p,tx;
};
struct node s[105];
bool cmp(node a, node b)
{
    if(fabs(a.tx - b.tx)  > exp1 )
        return a.tx > b.tx;
    else
        return a.x < b.x;
}
int main()
{
    int i,n,t;
    while(scanf("%d",&t) != EOF)
    {
        while(t --)
        {
            scanf("%d",&n);
            for(i = 0; i < n; i ++)
                scanf("%lf",&s[i].t);
            for(i = 0; i < n; i ++)
            {
                scanf("%lf",&s[i].p);
                s[i].x = i + 1;
                s[i].tx = s[i].p / s[i].t;
            }
            sort(s,s+n,cmp);
            for(i = 0; i < n; i ++)
            {
                if(i != 0)
                    printf(" ");
                printf("%d",s[i].x);
            }
            printf("\n");
        }
    }
    return 0;
}

H.公孙玉龙

题目链接:https://www.bttcacm.cn/problem.php?id=1028

#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
using namespace std;

char bianliang[105][105];
char value[105][105];
int len;

char temp[105][105];
int icount=0;

char a[105],b[105];

void fz(char t[],int index){
    if((t[0]>='A' && t[0]<='Z')||(t[0]>='a' && t[0]<='z')){
        for(int i=0;i<len;i++){
            if(!strcmp(bianliang[i],t)){
                fz(value[i],index);
                //strcpy(value[index],value[i]);
            }
        }
    }
    else{
        strcpy(value[index],t);
    }
    return;
}

int main(){
    int T;
    while(scanf("%d",&T)!=EOF){
        while(T--){
            memset(bianliang,0,sizeof(bianliang));
            memset(value,0,sizeof(value));
            len = 0;

            memset(temp,0,sizeof(temp));
            icount=0;

            int n;
            scanf("%d",&n);
            for(int i=0;i<n;i++){
                scanf("%s",a);
                scanf("%s",b);
                int flag=0;
                int j;
                for(j=0;j<len;j++){
                    if(!strcmp(a,bianliang[j])){
                        fz(b,j);
                        flag=1;
                        break;
                    }
                }
                if(!flag){
                    strcpy(bianliang[len++],a);
                    fz(b,j);
                }
                
                /*for(int i=0;i<len;i++)
                    printf("<%s>   <%s>\n",bianliang[i],value[i]);
                printf("---------------\n");*/
            }
            //for(int i=0;i<len;i++)
            //    printf("<%s>   <%s>\n",bianliang[i],value[i]);


            for(int i=0;i<len;i++){
                int flag=0;
                int j;
                for(j=0;j<icount;j++){
                    if(!strcmp(temp[j],value[i])){
                        flag=1;
                        break;
                    }
                }
                if(!flag){
                    strcpy(temp[icount++],value[i]);
                }
            }
            printf("%d\n",icount);

        }
    }
    return 0;
}

I.米波

题目链接:https://www.bttcacm.cn/problem.php?id=1029

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;

long long int dp[10000];
long long int const MOD=1e9+7;

int main(){
    int T,k,m,t;
    cin >> T;
    while(T--){
        memset(dp,0,sizeof(dp));
        dp[0]=1;
        cin >> k >> m >> t;
        for(int i=1;i<=t;i++){
            long long int q=0;
            for(int j=i-m+1;j<=i-k;j++){
                q+=j<0?0:dp[j];
                q%=MOD;
            }
            dp[i]=q%MOD;
        }
        long long int sum=0;
        for(int i=2;i<=t;i++){
            dp[i]+=dp[i-1];
            dp[i]%=MOD;
        }
        sum=dp[t]-dp[t-m];
        if(sum<0)
            sum+=MOD;
        cout << sum << '\n';
    }
    return 0;
}

J.瑞秋

题目链接:https://www.bttcacm.cn/problem.php?id=1030

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
    int a[100][90];
    int t;
    cin>>t;
    while(t--){
        memset(a,0,sizeof(a));
        for(int i=0;i<10;i++)
            for(int j=0;j<9;j++)
                scanf("%d",&a[i][j]);
        int n;
        cin>>n;
        int sum=0;
        int x,y;
        for(int i=0;i<10;i++)
            for(int j=0;j<9;j++)
                if(a[i][j]==3){
                    x=i;
                    y=j;
                    break;
                }
        for(int i=x-1;i>=0;i--){
            if(a[i][y]==1)
                break;
            if(a[i][y]==2){
                sum++;
                break;
            }
        }
        for(int i=x+1;i<10;i++){
            if(a[i][y]==1)
                break;
            if(a[i][y]==2){
                sum++;
                break;
            }
        }
        for(int j=y-1;j>=0;j--){
            if(a[x][j]==1)
                break;
            if(a[x][j]==2){
                sum++;
                break;
            }
        }
        for(int j=y+1;j<9;j++){
            if(a[x][j]==1)
                break;
            if(a[x][j]==2){
                sum++;
                break;
            }
        }
        if(sum==n)
            cout<<"Yes\n";
        else
            cout<<"No\n";
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_26122455/article/details/80616748