zoukankan      html  css  js  c++  java
  • 2020牛客暑期多校训练营(第三场)

    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 }
    View Code

    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 }
    View Code

    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 }
    View Code

    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,将分式通分得到(cfde)/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 }
    View Code

    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 }
    View Code
  • 相关阅读:
    替身邮:同一个邮箱多个名字
    CAGD: 第九章 几何连续性1
    Windows 2008 server 安装 Windows Live Essential 2011 的问题
    设计、仿真、工艺、加工、优化、开发交流QQ群 106930856 行业软件、二次开发、优化技术
    著佐权(Copyleft)
    Proe 二次开发:Session(会话) 对象
    CAGD: 第八章 曲线的几何处理技术
    UG/NX FEA 网格
    CAGD第十二章B样条曲面2
    推荐网络硬盘:金山快盘 15G
  • 原文地址:https://www.cnblogs.com/lilibuxiangtle/p/13336652.html
Copyright © 2011-2022 走看看