A、Clam and Fish
题意:有四种池塘:
1、无鱼无蛤蜊
2、无鱼有一个蛤蜊
3、一条鱼无蛤蜊
4、一条鱼一个蛤蜊
一个蛤蜊可以换一包鱼饵,而一包鱼饵可以钓一条鱼(即使在没有鱼的池塘里面)。给出n个池塘的情况,求出能获得的鱼的最大数量。
思路:贪心。我们发现,对于一个池塘,如果有鱼的话,肯定是钓鱼,如果没有鱼有蛤蜊的话,肯定是先换用蛤蜊换鱼饵。如果遇到啥也没有的情况,那么我们就看看现在有没有鱼饵,有的话换鱼,没有的话就啥也不做。
代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; char c[2000010]; int main(){ int t; scanf("%d",&t); while(t--){ int n; scanf("%d",&n); getchar(); gets(c+1); ll ans=0; ll k0=0; for(int i=1;i<=n;++i){ if(c[i]=='2'||c[i]=='3') ans++; if(c[i]=='1') k0++; else if(c[i]=='0'){ if(k0){ ans++; k0--; } } } ans+=(k0/2); printf("%ld\n",ans); } return 0; }
B、 Classical String Problem
题意:对于个字符串进行两种处理,modify x:x为正就将字符串循环右移x个位置,x为负就将字符串循环左移x个位置。qury x:询问当前情况下的第x个字符是多少。
思路:注意用scanf读入,否则会TLE。我们发现,对于最后的查询操作的话,我们只需要先知道当前这个字符串相对于最开始的时候的移位情况即可。这里我们用k来记录,每执行一个modify操作的话,我们就让k进行相应的变化。最后到查询操作的时候,只需也将x进行相应的变化即可。但是这里要注意边界。
代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; char c[10000010]; int main(){ gets(c+1); ll len=strlen(c+1); ll k=0; ll q; scanf("%ld",&q); while(q--){ getchar(); char ch; scanf("%c",&ch); ll x; scanf("%ld",&x); if(ch=='A'){ int index; if((x+k)%len!=0) index=((x+k)%len+len)%len; else index=len; //最右边的话就不用取模 printf("%c\n",c[index]); } else if(ch=='M'){ k+=x; } } return 0; }
C、Operation Love
题意:按照顺时针或者逆时针的顺序给出20个点表示机器人的手的平面,判断这只手是左手还是右手。
思路:这题要看懂题目来,题目是有点长。我之前一位机器人的手的大小是会变化的,没想到这只手只会进行旋转翻转之类的。
观察图片我们可以发现,机器人的手有一条边长AB=9,而且与他相邻的两条边为6和8,那么解题的突破口就在这里了。我们先找到长为9的那条边上的两个点,然后看他下一个点的长度,由于题目给点的方向我们不确定,那么我们就可以通过向量叉乘的方法来进行判断,我们找到长为9的那两个点之后,我们如果他的下一个边长为6而且AB,AC向量的叉积大于0的话,说明这个点是按找逆时针给出的,这是左手,如果下一边的长度为8,而且AB,AC向量的叉积小于0的话,说明这是顺时针给出的,这是左手,其余情况就是右手的情况了。(其实这里的叉积的作用就是来判断题目给出的点的顺序)
代码:
#include<bits/stdc++.h> #define eps 1e-5 using namespace std; struct node{ double x,y; }Node[25]; double cj(int a,int b,int c){ return (Node[b].x-Node[a].x)*(Node[c].y-Node[a].y)-(Node[b].y-Node[a].y)*(Node[c].x-Node[a].x); } double dis(int a,int b){ double tmp1=(Node[b].x-Node[a].x)*(Node[b].x-Node[a].x); double tmp2=(Node[b].y-Node[a].y)*(Node[b].y-Node[a].y); return sqrt(tmp1+tmp2); } void solve(){ for(int i=0;i<20;i++) cin>>Node[i].x>>Node[i].y; int i; for(i=0;i<20;i++){ double tmp=dis(i,(i+1)%20); if(fabs(tmp-9.0)<eps) break; } int a=i,b=(i+1)%20,c=(i+2)%20; if(fabs(dis(b,c)-8.0)<eps&&cj(a,b,c)<0){ cout<<"left"<<endl; return ; } if(fabs(dis(b,c)-6.0)<eps&&cj(a,b,c)>0){ cout<<"left"<<endl; return; } cout<<"right"<<endl; } int main(){ int t; cin>>t; while(t--){ solve(); } return 0; }
L、 Problem L is the Only Lovely Problem
题意:给出一个字符串,判断是否以lovely开头,不区分大小写。
思路:先统一换成大写或者小写,然后进行判断即可。
代码:
#include<bits/stdc++.h> using namespace std; int main(){ string s; cin>>s; int len=s.length(); for(int i=0;i<len;i++){ if(s[i]<='Z'&&s[i]>='A') s[i]+=32; } if(len<6) cout<<"ugly"<<endl; if(s[0]=='l'&&s[1]=='o'&&s[2]=='v'&&s[3]=='e'&&s[4]=='l'&&s[5]=='y') cout<<"lovely"<<endl; else cout<<"ugly"<<endl; return 0; }