ABCFL
A. Clam and Fish
题意
一个游戏有n次,每次有四种类型:
0:没有鱼也没有蛤蜊
1:没有鱼有一个蛤蜊
2:有一个鱼没有蛤蜊
3:有一个鱼和一个蛤蜊
游戏每次可以执行下面4中操作中的一种:
1:用蛤蜊换一报鱼饵
2:直接抓一条鱼
3:用鱼饵钓一条鱼
4:不做任何操作
问n次之后最多可以拥有鱼。
题解
如果有鱼的话肯定要优先选择2直接抓鱼,这样不需要鱼饵。如果没有鱼的话有蛤蜊的话,就先换鱼饵,因为如果遇到没有鱼也没有蛤蜊的时候就可以钓鱼了。如果鱼饵多出来了,可以在最后的时候两个鱼饵变成一条鱼,相当于换一次鱼饵钓一次鱼。如果没有蛤蜊也没有鱼,如果有鱼饵的话就钓鱼,否则就跳过。
代码
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define pb push_back 4 #define ft first 5 #define sd second 6 #define pii pair<int,int> 7 #define pll pair<ll,ll> 8 using namespace std; 9 10 int main() 11 { 12 int t; 13 cin>>t; 14 while(t--){ 15 int n; 16 string s; 17 cin>>n>>s; 18 int p=0,q=0; 19 for(int i=0;i<n;i++){ 20 if(s[i]=='0'){ 21 if(p) p--,q++; 22 else continue; 23 } 24 else if(s[i]=='1'){ 25 p++; 26 } 27 else q++; 28 } 29 q+=p/2; 30 cout<<q<<endl; 31 } 32 }
B. Classical String Problem
题意
有n个操作,如果操作是A,输出第x个数字。如果操作是M,并且x是正数,那么就将前x个字符移到最后边,否则将后x个字符移到最前边。
题解
被队友一句话点醒,维护一个起点就好了,因为这个移动就相当于是起点在动,字符串是不动的。如果x>0,那么起点标志向后移动x位,否则向前移动x位,当然要记得对字符串长度取余。
代码
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define pb push_back 4 #define ft first 5 #define sd second 6 #define pii pair<int,int> 7 #define pll pair<ll,ll> 8 using namespace std; 9 10 char s[2001000]; 11 12 int main() 13 { 14 scanf("%s",s); 15 int n; 16 scanf("%d",&n); 17 int b=0; 18 int p=strlen(s); 19 while(n--){ 20 char a[2]; 21 scanf("%s",a); 22 int x; 23 scanf("%d",&x); 24 if(a[0]=='A'){ 25 printf("%c ",s[(b+x-1)%p]); 26 } 27 else{ 28 b+=x; 29 b=(b+p)%p; 30 } 31 } 32 return 0; 33 }
C. Openration Love
题意
t组测试,每次测试按顺时针或逆时针给20个点,是一个手的形状,问是左手还是右手。
题解
这个题可以用凸包解,板子求出凸包的所有点记录下来,然后求一下长度为6的边(即大拇指)的下一条边是不是底下长度为9的边。是的话就是右手,否则为左手。但是,这个题他卡精度,两个边长相等判断的时候要用fabs(d1,d2)<1e-5,比1e-5更大一些也可以,小的话会wa,wa到哭。
代码
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define pb push_back 4 #define ft first 5 #define sd second 6 #define pii pair<int,int> 7 #define pll pair<ll,ll> 8 using namespace std; 9 10 struct node 11 { 12 double x,y; 13 }p[100],s[100]; 14 double xx,yy; 15 double cross(node a,node b,node c) 16 { 17 return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y); 18 } 19 double dis(node a,node b) 20 { 21 return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); 22 } 23 int cmp1(node a,node b) 24 { 25 if(a.y==b.y) return a.x<b.x; 26 return a.y<b.y; 27 } 28 int cmp2(node a,node b) 29 { 30 if(atan2(a.y-yy,a.x-xx)==atan2(b.y-yy,b.x-xx)) return a.x<b.x; 31 else return atan2(a.y-yy,a.x-xx)<atan2(b.y-yy,b.x-xx); 32 } 33 int main() 34 { 35 ios::sync_with_stdio(false); 36 cin.tie(0); 37 cout.tie(0); 38 int t; 39 cin>>t; 40 while(t--){ 41 memset(p,0,sizeof(p)); 42 memset(s,0,sizeof(s)); 43 int n=20; 44 for(int i=0;i<n;i++){ 45 cin>>p[i].x>>p[i].y; 46 } 47 sort(p,p+n,cmp1); 48 xx=p[0].x,yy=p[0].y; 49 sort(p+1,p+n,cmp2); 50 s[0]=p[0],s[1]=p[1]; 51 int top=1; 52 for(int i=2;i<n;i++){ 53 while(cross(s[top-1],s[top],p[i])<0) top--; 54 //如果是向右转,这个中间点就不是我们要找的点 55 s[++top]=p[i];//如果是向左转,就加进来 56 } 57 double q=dis({1.0,0.0},{1.0,6.0}); 58 double y=dis({1.0,0.0},{10.0,0.0}); 59 for(int i=0;i<=top;i++){ 60 double k=dis(s[i],s[(i+1)%(top+1)]); 61 if(fabs(q-k)<1e-1) { 62 double x=dis(s[(i+1)%(top+1)],s[(i+2)%(top+1)]); 63 if(fabs(x-y)<1e-1) cout<<"right"<<endl; 64 else cout<<"left"<<endl; 65 break; 66 } 67 } 68 } 69 return 0; 70 }
F. Fonction Construction Problem
题意
给你a和b,求出一组解 c d e f 满足c/d - e/f = a/b,并且d<b, f<b。
没有解的话输出 “-1 -1 -1 -1” 。
题解
-
b是1的时候肯定是无解的,分母不能为0,所以直接输出四个-1。
-
令g=gcd(a,b),如果g>1,说明分式不是最简的,那么可以给他化简成a'/b',那么解就是d=f=b',c=a'+1,e=1;
-
如果g==1,将分式通分得到(cf−de)/de = a/b,将b分解成d * f,d和f互质,如果没有这样的d和f,就输出四个-1。用大雪菜老师的线性筛预处理2e6的所有数的最小质因子,就可以在O(logn)内求出d和f了。那么现在只需要求出cf-de=a就好了,这不就是拓展欧几里得吗,至于怎么求其他的几组解,可以看这个博客:https://www.cnblogs.com/Antigonae/p/10106068.html 。
代码
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define pb push_back 4 #define ft first 5 #define sd second 6 #define pii pair<int,int> 7 #define pll pair<ll,ll> 8 using namespace std; 9 10 const ll maxn=2e6+10; 11 ll st[maxn]; 12 ll prime[maxn]; 13 ll factor[maxn]; //记录最小质因数 14 ll cnt; 15 16 void Prime(ll n) 17 { 18 cnt=0; 19 for(ll i=2;i<=n;i++){ 20 if(!st[i]) prime[cnt++]=i,factor[i]=i; 21 for(int j=0;prime[j]*i<=n;j++){ 22 st[prime[j]*i]=1; 23 factor[prime[j]*i]=prime[j]; 24 if(i%prime[j]==0) break; 25 } 26 } 27 } 28 29 ll gcd(ll a, ll b) 30 { 31 return b? gcd(b, a%b) : a; 32 } 33 34 void ex_gcd(ll a, ll b, ll &x, ll &y) 35 { 36 if(!b){ 37 x = 1, y = 0; 38 return ; 39 } 40 ex_gcd(b, a%b, y, x); 41 y -= a/b * x; 42 return ; 43 } 44 45 int main() 46 { 47 ios::sync_with_stdio(false); 48 cin.tie(0); 49 cout.tie(0); 50 Prime(2000000); 51 int t; 52 cin>>t; 53 while(t--){ 54 ll a,b; 55 cin>>a>>b; 56 if(b==1) {cout<<"-1 -1 -1 -1"<<endl;continue;} 57 ll g=gcd(a,b); 58 if(g>1){ 59 cout<<a/g+1<<' '<<b/g<<' '<<1<<' '<<b/g<<endl; 60 } 61 else{ 62 ll f=1,d=b,p=factor[b]; 63 while(p>1&&d%p==0) d/=p,f*=p; 64 if(d==1){ //没有两个互质的质因子 65 cout<<"-1 -1 -1 -1"<<endl; 66 continue; 67 } 68 ll c,e; 69 ex_gcd(d,f,e,c); 70 e=-e; 71 if(c<=0||e<=0){ 72 ll c1=(c%d+d)%d; 73 ll e1=(e%f+f)%f; 74 ll res=max(0ll,max((e1-e)/f,(c1-c)/d)); 75 e+=f*res,c+=d*res; 76 } 77 e*=a,c*=a; 78 cout<<c<<' '<<d<<' '<<e<<' '<<f<<endl; 79 } 80 } 81 return 0; 82 }
L. Problem L is the Only Lovely Problem
题意
不管大小写,如果给出的字符串前6个字符是lovely,那么输出 "lovely ",否则输出 "ugly" 。
题解
先判断一下字符串的长度,如果小于6的话,就可以直接输出ugly,然后在去判断前6个字符是不是和lovely一样。
代码
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define pb push_back 4 #define ft first 5 #define sd second 6 #define pii pair<int,int> 7 #define pll pair<ll,ll> 8 using namespace std; 9 10 int main() 11 { 12 ios::sync_with_stdio(false); 13 cin.tie(0); 14 cout.tie(0); 15 string s="lovely"; 16 string a; 17 cin>>a; 18 if(a.size()<6) cout<<"ugly"<<endl; 19 else{ 20 for(int i=0;i<a.size();i++){ 21 if(i>5){ 22 cout<<s<<endl; 23 return 0; 24 } 25 if(a[i]==s[i]||a[i]==s[i]-'a'+'A') continue; 26 else break; 27 } 28 cout<<"ugly"<<endl; 29 } 30 return 0; 31 }