1. 程式人生 > >2018年內蒙古自治區第十三屆大學生程式設計競賽題解

2018年內蒙古自治區第十三屆大學生程式設計競賽題解

A.內蒙創業

簡單判斷是否符合條件即可

#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.涮羊肉

首先處理出所有肉變得美味的時刻,對它們從小到大排序,使用貪心策略,一旦可以撈肉就撈。這樣就可以使每次可以撈肉的起始時間儘量早。

#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.狙擊敵人

判斷斜率和方向即可

#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.醫療兵

動態規劃,有七種轉移:
  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.逃離機場

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.洗衣服

模擬

#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.哥本哈根妖

反證法可以證明以