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.后八位必须为数字;
现在有若干个字符串,希望你写一个程序判断它是不是一个合法编号。
编号的命名规则如下:
1.长度为10位;
2.前两位必须为”LQ”;
3.后八位必须为数字;
现在有若干个字符串,希望你写一个程序判断它是不是一个合法编号。
Input
第一行一个T(1≤T≤20)代表数据组数。
每组测试数据有一个字符串s(1≤|s|≤20),s只包含数字和大写英文字母,代表等待判断的字符串。
每组测试数据有一个字符串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秒才能再捞(每次只能捞一个)。
那么用最合理的策略,莱特最多能吃到多少美味羊肉?
有一天,莱特跟瑞秋一起去内蒙吃涮羊肉,瑞秋往锅里下羊肉,莱特负责吃。
不同部位的肉要煮不同的时间,才能变得美味。莱特希望吃到最多的美味羊肉,但是莱特的手速不够快,用m代表莱特的手速,每次下手捞羊肉后要过m秒才能再捞(每次只能捞一个)。
那么用最合理的策略,莱特最多能吃到多少美味羊肉?
Input
第一行一个T(1≤T≤120)代表数据组数。
每组数据:
第一行两个整数n,m(1≤n,m≤1000),其中n代表瑞秋往锅里下的羊肉个数,m代表莱特的手速。
接下来n行,每行两个数x,y(1≤x,y≤1000)代表第x秒下的肉过y秒才能变得美味。
每组数据:
第一行两个整数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”。
小明拿着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,−1000≤dx,dy≤1000。
每组测试数据有 6 个整数 x1,y1,x2,y2,dx,dy,小明的枪口坐标为 (x1,y1), 敌人的坐标为(x2,y2),子弹的运动方向为 (dx,dy),保证枪口坐标和敌人的坐标不同,1 ≤ x1,y1,x2,y2 ≤ 1000,−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
#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!”(不含引号)。
现在把机场看作一个二维平面,’.’ 代表可以走的空地,’@’代表小明当前的位置,’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的方阵,’@’只有一个。
每组测试数据有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分钟,求最短结束时间(假设从洗衣机里取衣服放衣服不消耗时间,每台洗衣机同一时间只能执行一个任务)。
为了方便计算,问题简化为: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分钟加入排队。
每组数据两行:
第一行两个整数n(1≤n≤100),m(1≤m≤1000)。n代表洗衣机台数,m代表有m个洗衣任务。
第二行,m个整数(单调不下降),每个整数xi(0≤xi≤50,000)代表这个任务第xi分钟加入排队。
Output
每组数据输出一个整数代表所有任务的结束时间。
对于第一个样例,只有一台洗衣机,在第一分钟有一个洗衣任务,那么这个洗衣任务在第(1+45)分钟结束。
对于第二个样例,有两台洗衣机,第一个任务交给1号洗衣机,第二个任务交给2号洗衣机,第二个任务在第(2+45)分钟完成,在第(1+45)分钟1号洗衣机完成洗衣任务并开始第三个任务,第三个任务在第(1+45+45)分钟完成,所以答案为91。
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变量在之前已被赋值。如果一个整数对象没有被任何一个变量所引用,则该整数对象被系统回收。如果两个整数对象的值相同,则它们是同一个整数对象。
请你输出最终有多少个整数对象没有被回收。
现在有若干个赋值语句,每个赋值语句由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。
每一组数据第一行为一个正整数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),表示小朋友的答案。
每一组数据由两部分组成。第一部分为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;
}