2018杭电ACM集训队单人排位赛 - 1

Problem A. 内蒙创业

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 141    Accepted Submission(s): 83


Problem Description
莱特与瑞秋毕业了,他们决定在内蒙创业成立一家畜牧业公司,创业第一步:他们希望给公司里的每一只羊一个编号。
编号的命名规则如下:
1.长度为10位;
2.前两位必须为”LQ”;
3.后八位必须为数字;
现在有若干个字符串,希望你写一个程序判断它是不是一个合法编号。
 

Input
第一行一个T(1≤T≤20)代表数据组数。
每组测试数据有一个字符串s(1≤|s|≤20),s只包含数字和大写英文字母,代表等待判断的字符串。
 

Output
如果编号合法输出”YES”,否则输出”NO”。
 

Sample Input
 
  
3 LQ12345678 LQ123 QL12345678
 

Sample Output
 
  
YES NO

NO

水题........

#include<bits/stdc++.h>
using namespace std; 

int main()
{
    char s[30];
    int t;scanf("%d",&t);
    while(t--)
    {
        scanf("%s",s);
        int flag=0;
        if(strlen(s)==10&&s[0]=='L'&&s[1]=='Q')
        {
            for(int i=2; i<10; i++)
            {
                if(s[i]>='0'&&s[i]<='9')flag=1;
                else 
                {
                    flag=0;
                    break;
                }
            }
            if(flag)puts("YES");
            else puts("NO");
        }
        else puts("NO");
    } 
    return 0;
}

Problem B. 涮羊肉

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 189    Accepted Submission(s): 74


Problem Description
内蒙的羊由于生长的地域和气候的不同,产出的羊肉区别于其它地区的羊肉,以鲜嫩味美著称。
有一天,莱特跟瑞秋一起去内蒙吃涮羊肉,瑞秋往锅里下羊肉,莱特负责吃。
不同部位的肉要煮不同的时间,才能变得美味。莱特希望吃到最多的美味羊肉,但是莱特的手速不够快,用m代表莱特的手速,每次下手捞羊肉后要过m秒才能再捞(每次只能捞一个)。
那么用最合理的策略,莱特最多能吃到多少美味羊肉?
 

Input
第一行一个T(1≤T≤120)代表数据组数。
每组数据:
第一行两个整数n,m(1≤n,m≤1000),其中n代表瑞秋往锅里下的羊肉个数,m代表莱特的手速。
接下来n行,每行两个数x,y(1≤x,y≤1000)代表第x秒下的肉过y秒才能变得美味。
 

Output
每个询问输出一个整数代表答案。
 

Sample Input
 
  
2 2 1 1 2 2 1 3 1 1 2 1 3 2 3
 

Sample Output
 
  
1 3

对每块美味的肉的时间排序,然后在m秒后取美味,可的最多美味肉

#include<bits/stdc++.h>
using namespace std; 

int n,m,x,y;
int a[1005];
int main()
{
    int t;scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        for(int i=0; i<n; i++)
        {
            scanf("%d%d",&x,&y);
            a[i]=x+y;
        }
        sort(a,a+n);
        int k=0,cnt=1;
        for(int i=1; i<n; i++)
        {
            if(a[i]-a[k]>=m)
            {
                cnt++;
                k=i;
            }
        }
        printf("%d\n",cnt);
    }
    return 0;
}

Problem C. 狙击敌人

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 256    Accepted Submission(s): 76


Problem Description
小明有一次运气贼好,跳在一个小野区,突然掉了一个空投,直接砸在他的脸上,可把他乐坏了。走近一打开补给包,AWM+3级头+8倍镜+20发.300马格南,令人窒息!
小明拿着AWM,立即往山上跑,想用这把传说中的枪,爆敌人的头。不一会,小明看到一个挂机仔,躲在一块石头后面。我们将小明的枪口和挂机仔的头看成二维平面上的两个点(x1,y1),(x2,y2),小明瞄准后开了一枪,子弹按照(dx,dy)的方向运动(即每毫秒子弹的x坐标+dx,y坐标+dy),如果子弹的运动轨迹能经过(x2,y2),那么子弹就能打中敌人的头,我们来预测一下小明能否用这把AWM一枪爆掉敌人的头,如果能,输出”YES”,否则输出”NO”。
 

Input
多组测试数据,首先第一行一个整数T(1≤T≤20),代表测试数据组数。
每组测试数据有 6 个整数 x1,y1,x2,y2,dx,dy,小明的枪口坐标为 (x1,y1), 敌人的坐标为(x2,y2),子弹的运动方向为 (dx,dy),保证枪口坐标和敌人的坐标不同,1 ≤ x1,y1,x2,y2 ≤ 1000,&#8722;1000≤dx,dy≤1000。
 

Output
如果小明能用这把AWM一枪爆掉敌人的头,输出”YES”,否则输出”NO”。
 

Sample Input
 
  
2 1 1 2 2 2 2 1 1 3 1 0 1
 

Sample Output
 
  
YES NO
分两种情况 1.斜率存在的情况,2斜率不存在的情况。(注意:子弹的方向)
#include<bits/stdc++.h>
using namespace std; 

int main()
{
    int t;scanf("%d",&t);
    while(t--)
    {
        int x1,y1,x2,y2,dx,dy;
        scanf("%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&dx,&dy);
        if(dx==0)
        {
            if(x1!=x2)
                puts("NO");
            else if(dy>0)
            {
                if(y2>y1)puts("YES");
                else puts("NO");
            }
            else if(dy<0)
            {
                if(y2<y1)puts("YES");
                else puts("NO");
            }
        }
        else
        {
            double k=dy*1.0/dx;
            if(x2-x1==0)
            {
                printf("NO\n");
                continue;
            }
            double k1=(y2-y1)*1.0/(x2-x1);
            if(k1!=k)
            {
                printf("NO\n");
                continue;
            }
            else
            {
                if((y2-y1)/dy>=0&&(x2-x1)/dx>=0)
                {
                    printf("YES\n");
                }
                else
                {
                    printf("NO\n");
                }
            }

        }
    }
    return 0;
}

Problem E. 逃离机场

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 269    Accepted Submission(s): 52


Problem Description
小明听说机场是一个很肥的地方,所以想跳一波机场,看看到底有多肥。不过机场虽然肥,但是跳的人也多。小明第一次跳机场,刚跳下来就到处都是枪声,小明吓得快要哭出来了,想逃离机场,emmm,还是打野比较适合他。
现在把机场看作一个二维平面,’.’ 代表可以走的空地,’@’代表小明当前的位置,’x’代表这里是个障碍物,’o’代表这里有个敌人,并且手里有枪,敌人可以攻击上下左右四个方向,小明只要走到或者一开始就在敌人可以攻击的位置,就会死亡(机场个个都是98K爆头dalao),子弹不会穿过障碍物,敌人不会移动。小明只能往上下左右走,每走一步需要1秒,只要小明移动到机场的边缘再走一步就算逃离了机场,现在小明请你帮他找一条最快逃离机场的线路,输出这个时间,如果怎么都逃不出去,输出”no zuo no die!”(不含引号)。
 

Input
多组测试数据,首先第一行一个整数T,代表测试数据组数。1≤T≤100。
每组测试数据有n,m(1≤n,m≤200),代表机场是一个n×m的方阵,接下来是一个由’.’,’@’,’x’,’o’构成的n×m的方阵,’@’只有一个。
 

Output
对于每组数据输出一个数代表最快需要多少时间逃出机场,或者”nozuonodie!”。
 

Sample Input
 
  
3 5 5 .x.x. .x.x. ..... ..@.. .o.o. 3 3 @.. xxx o.x 3 3 o.o .@. .x.
 

Sample Output
 
  
4 1 no zuo no die!

也就是dfs,bsf可能会超时。细节地方很多。把敌人可以射击的位置都标记-1.dfs求到边缘的最短路。

#include<bits/stdc++.h>
using namespace std;

#define inf 0x3f3f3f3f
double pi=acos(-1);
char mp[210][210];
int n,m,book[210][210],sx,sy;
int ans=inf;
struct node{
    int x,y;
};
int p(int x,int y){
    if(book[x][y]==-1)return 0;
    if(x<n&&x>=0&&y<m&&y>=0)return 1;
    return 0;
}
void bfs(int x,int y)
{
    int i,j,ans=inf;
    int a[]={0,0,1,-1};
    int b[]={1,-1,0,0};
    queue <node> q;
    node add;
    add.x=x;add.y=y;
    q.push(add);
    while(!q.empty())
    {
        node aa;
        aa.x=q.front().x;
        aa.y=q.front().y;
        q.pop();
        for(i=0;i<4;i++)
        {
            add.x=aa.x+a[i];
            add.y=aa.y+b[i];
            if(p(add.x,add.y))
            {
                if(book[aa.x][aa.y]+1<book[add.x][add.y])
                {
                    book[add.x][add.y]=book[aa.x][aa.y]+1;
                    q.push(add);
                }
            }
        }
    }
}
int main()
{
    int i,j,t;
    cin>>t;
    while(t--)
    {
        scanf("%d%d",&n,&m);
        for(i=0;i<n;i++)
            scanf("%s",&mp[i]);
        for(i=0;i<n;i++)
            for(j=0;j<m;j++)
                book[i][j]=inf;
        for(i=0;i<n;i++)
            for(j=0;j<m;j++)
                if(mp[i][j]=='@')
                {
                    sx=i;sy=j;
                }
                else if(mp[i][j]=='x')
                    book[i][j]=-1;
                else if(mp[i][j]=='o')
                {
                    for(int g=i;g<n;g++)
                        if(mp[g][j]=='x')break;
                        else book[g][j]=-1;
                    for(int g=i;g>=0;g--)
                        if(mp[g][j]=='x')break;
                        else book[g][j]=-1;

                    for(int g=j;g<m;g++)
                        if(mp[i][g]=='x')break;
                        else book[i][g]=-1;
                    for(int g=j;g>=0;g--)
                        if(mp[i][g]=='x')break;
                        else book[i][g]=-1;
                }
      
        if(book[sx][sy]==-1)printf("no zuo no die!\n");
        else
        {
            book[sx][sy]=0;
            bfs(sx,sy);
            ans=inf;
            for(i=0;i<n;i++)
                if(book[i][0]!=inf&&book[i][0]!=-1)
                {ans=min(ans,book[i][0]);}
            for(i=0;i<n;i++)
                if(book[i][m-1]!=inf&&book[i][m-1]!=-1)
                {ans=min(ans,book[i][m-1]);}
                
            for(i=0;i<m;i++)
                if(book[0][i]!=inf&&book[0][i]!=-1)
                {ans=min(ans,book[0][i]);}
            for(i=0;i<m;i++)
                if(book[n-1][i]!=inf&&book[n-1][i]!=-1)
                {ans=min(ans,book[n-1][i]);}
            if(ans==inf)printf("no zuo no die!\n");
            else printf("%d\n",ans+1);
        }
    }
    return 0;
}

Problem F. 洗衣服

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 84    Accepted Submission(s): 63


Problem Description
小明是一个优秀的程序员,但他讨厌洗衣服,所以每次都用公共洗衣机洗衣服,但他带衣服过去的时候总是发现没有洗衣机空闲,需要等很久。作为一个优秀的程序员,小明黑入了洗衣房的监控,获得了所有人去洗衣服的时刻,但他不知道,这些衣服什么时候都洗完。请你帮助他写一个程序解决这个问题。
为了方便计算,问题简化为:n台洗衣机,m个洗衣服任务,每个从xi开始持续45分钟,求最短结束时间(假设从洗衣机里取衣服放衣服不消耗时间,每台洗衣机同一时间只能执行一个任务)。
 

Input
第一行一个T(1≤T≤20)代表数据组数。
每组数据两行:
第一行两个整数n(1≤n≤100),m(1≤m≤1000)。n代表洗衣机台数,m代表有m个洗衣任务。
第二行,m个整数(单调不下降),每个整数xi(0≤xi≤50,000)代表这个任务第xi分钟加入排队。
 

Output
每组数据输出一个整数代表所有任务的结束时间。
Hint

对于第一个样例,只有一台洗衣机,在第一分钟有一个洗衣任务,那么这个洗衣任务在第(1+45)分钟结束。
对于第二个样例,有两台洗衣机,第一个任务交给1号洗衣机,第二个任务交给2号洗衣机,第二个任务在第(2+45)分钟完成,在第(1+45)分钟1号洗衣机完成洗衣任务并开始第三个任务,第三个任务在第(1+45+45)分钟完成,所以答案为91。
 

Sample Input
 
  
2 1 1 1 2 3 1 2 3
 

Sample Output
 
  
46 91

用一个小顶堆,先安排没有工作的洗衣机,没有洗衣机的时候,等最先洗好的洗衣机安排任务,pop()出这台洗衣机

因为一直是最小的,所以最后洗好的肯定是最大的值也就是洗完的

#include<bits/stdc++.h>
using namespace std;

int a[1005];
int main()
{
    int t;scanf("%d",&t);
    while(t--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=0; i<m; i++)
        {
            scanf("%d",&a[i]);
        }
        priority_queue<int, vector<int>, greater<int> > q;
        for(int i=0; i<n; i++)
        {
            q.push(a[i]+45);
        }
        for(int i=n; i<m; i++)
        {
            int k=q.top();
            q.pop();
            if(k<a[i])q.push(a[i]+45);
            else q.push(k+45);
        }
        while(q.size()!=1)
        {
            q.pop();
        }
        printf("%d\n",q.top());
        
    }
    return 0;
}

Problem H. 公孙玉龙

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 234    Accepted Submission(s): 46


Problem Description
公孙玉龙创造了一门动态类型编程语言,他想出了一种垃圾回收的方式。
现在有若干个赋值语句,每个赋值语句由a和b组成。变量名仅由小写和大写字母组成,已知a是一个变量名。整数对象为长度不超过100的整数。如果b是一个整数对象,那么表示b整数对象被a所引用。如果b是一个变量名,那么表示a引用b所引用的整数对象,并且保证b变量在之前已被赋值。如果一个整数对象没有被任何一个变量所引用,则该整数对象被系统回收。如果两个整数对象的值相同,则它们是同一个整数对象。
请你输出最终有多少个整数对象没有被回收。
 

Input
第一行包含一个正整数T(1≤T≤100)代表测试数据组数。
每一组数据第一行为一个正整数n(1≤n≤100),接下来n行每行由a,b组成,表示将b赋值给a,其中a为变量名,b为变量名或一个整数对象,1≤|a|,|b|≤100。
 

Output
对于每一组数据,输出最终有多少个整数对象没有被回收。
 

Sample Input
 
   
2 3 TNT 2 SNS 3 BNB 3 5 T 2 N 2 T N S 3 B 3
 

Sample Output
 
   
2 2
模拟一下怎么引用赋值,把每一个变量赋值,有引用的也先赋值。最后利用map标记已经赋值的变量。、

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
char s[1000][1000];
map<string,string> mp;
map<string,int> mp1;
int f(char x[]){
    int flag=1;
    int len=strlen(x);
    for(int i=0;i<len;i++){
        if(x[i]=='-'&&i==0){continue;}
        else if(x[i]>'9'||x[i]<'0'){return 0;}
    }
    return 1;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        int n;
        scanf("%d",&n);
        mp.clear();
        mp1.clear();
        for(int i=0;i<n;i++){
            char a[200],b[200];
            scanf("%s %s",a,b);
            if(f(b)){mp[a]=b;}
            else{mp[a]=mp[b];}
    
        }
        map<string,string>::iterator it;
        int res=0;
        for(it=mp.begin();it!=mp.end();it++)
        {
            if(!mp1[it->second]){res++;mp1[it->second]=1;}
        }
        printf("%d\n",res);
    }
}

Problem J. 瑞秋

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 140    Accepted Submission(s): 77


Problem Description
瑞秋,天才中国象棋少女。
充满爱心的她正在教幼儿园小朋友如何下中国象棋,现在她正教到“车”的用法。
“车”在中国象棋中威力很大,无论横线、竖线都可以行走,只要没有其他棋子的阻拦,“车”的步数不受限制。如果在走一着棋时,己方的“车”能够走到的位置有敌方棋子的存在,就可以把敌方棋子吃掉并且占领那个位置。
瑞秋想开发一个程序来帮助小朋友熟悉“车”的用法。她的朋友莱特设计出了中国象棋局面生成器,每个局面会告知指定己方“车”的位置以及其他所有棋子在棋盘中的位置和归属方。小朋友会对每一个局面给出他认为指定己方的“车”在下一着棋可以吃掉的敌方棋子个数。请你设计一个程序判断小朋友的答案是否正确。
 

Input
第一行包含一个正整数T(1≤T≤1,000)代表测试数据组数。
每一组数据由两部分组成。第一部分为10×9的矩阵表示中国象棋棋盘,0表示这个位置没有棋子,1表示这个位置被己方棋子占领,2表示这个位置被敌方棋子占领,3表示这个位置被指定己方的“车”占领,保证矩阵中有且只有一个位置的值为3。第二部分为一个整数ans(0≤ans≤4),表示小朋友的答案。
 

Output
对于每一组数据,如果小朋友的答案正确,输出”Yes”,否则输出”No”,输出不包含双引号。
 

Sample Input
 
  
2 1 0 1 0 2 0 0 0 0 2 0 0 3 1 0 2 0 0 0 0 0 0 2 0 1 2 0 1 0 1 0 0 1 0 0 0 2 0 2 2 0 0 1 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 2 1 0 2 0 2 0 3 2 0 0 0 1 0 1 1 0 0 0 2 0 2 0 0 2 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 2 2 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 2 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1
 

Sample Output
 
  
Yes Nos

水题

#include<bits/stdc++.h>
using namespace std; 

int main()
{
    int s[15][15];
    int t;scanf("%d",&t);
    while(t--)
    {
        int ans,x,y;
        for(int i=0; i<10; i++)
        {
            for(int j=0; j<9; j++)
            {
                scanf("%d",&s[i][j]);
                if(s[i][j]==3)
                {
                    x=i;
                    y=j;
                }
            }
        }
        scanf("%d",&ans);
        int cnt=0;
        for(int i=y-1; i>=0; i--)
        {
            if(s[x][i]==1)break;
            if(s[x][i]==2)
            {
                cnt++;
                break;
            }
        }
        for(int i=y+1; i<9; i++)
        {
            if(s[x][i]==1)break;
            if(s[x][i]==2)
            {
                cnt++;
                break;
            }
        }
        for(int i=x-1; i>=0; i--)
        {
            if(s[i][y]==1)break;
            if(s[i][y]==2)
            {
                cnt++;
                break;
            }
        }
        for(int i=x+1; i<10; i++)
        {
            if(s[i][y]==1)break;
            if(s[i][y]==2)
            {
                cnt++;
                break;
            }
        }
        if(cnt==ans)puts("Yes");
        else puts("No");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/yu121380/article/details/81036958
今日推荐