• AtCoder Beginner Contest 189


    A:

    判断三个字符是否相同。

     1 #include <iostream>
     2 #include <vector>
     3 #include <algorithm>
     4 #include <queue>
     5 #include <vector>
     6 #include <cstdlib>
     7 #include <cstring>
     8 using namespace std;
     9 string s;
    10 int main(void)
    11 {
    12     int a[26]={0};
    13     cin>>s;
    14     int res=0;
    15     for(int i=0;i<s.size();++i)
    16     {
    17         if(!a[s[i]-'A'])res++;
    18         if(res>1)
    19         {
    20             cout<<"Lost"<<endl;
    21             return 0;
    22         }
    23         a[s[i]-'A']=1;
    24     }
    25     cout<<"Won"<<endl;
    26     return 0;
    27 }

    B:

    判断在喝了第几杯体积为Vi、酒精百分比为Pi的酒后会醉,否则输出-1。

     1 #include <iostream>
     2 #include <vector>
     3 #include <algorithm>
     4 #include <queue>
     5 #include <vector>
     6 #include <cstdlib>
     7 #include <cstring>
     8 using namespace std;
     9 int n,x,v,p;
    10 int main(void)
    11 {
    12     cin>>n>>x;
    13     x*=100;
    14     for(int i=1;i<=n;++i)
    15     {
    16         cin>>v>>p;
    17         x-=v*p;
    18         if(x<0)
    19         {
    20             cout<<i<<endl;
    21             return 0;
    22         }
    23     }
    24     cout<<"-1"<<endl;
    25     return 0;
    26 }

    C:

    确定(l,r,x),使得(r-l+1)*x最大。

    分析:容易知道x即为A[l]到A[r]中的最小值,通过两次遍历记录l和当前最小的x,然后更新答案即可。

     1 #include <iostream>
     2 #include <vector>
     3 #include <algorithm>
     4 #include <queue>
     5 #include <vector>
     6 #include <cstdlib>
     7 #include <cstring>
     8 using namespace std;
     9 int n;
    10 int a[11000];
    11 int main(void)
    12 {
    13     cin>>n;
    14     for(int i=0;i<n;++i)cin>>a[i];
    15     int ans=0;
    16     for(int i=0;i<n;++i)
    17     {
    18         int minn=0x3f3f3f3f;
    19         for(int j=i;j<n;++j)
    20         {
    21             if(a[j]<minn)minn=a[j];
    22             ans=max(ans,(j-i+1)*minn);
    23         }
    24     }
    25     cout<<ans<<endl;
    26     return 0;
    27 }

    D:

    求出x多元组的数量,使得在满足所给的条件后yN为true。

    分析:假设t[i]为使得yi为true的多元组数量,f[i]为yi为false的多元组数量。当Si为AND时,t[i]=t[i-1](xi必须为true),f[i]=2*f[i-1]+t[i-1](若yi-1为false,则xi可为true or false;若yi-1为true,那xi只能为false)。当Si为OR时同理。最终答案为t[n]。

     1 #include <iostream>
     2 #include <vector>
     3 #include <algorithm>
     4 #include <queue>
     5 #include <vector>
     6 #include <cstdlib>
     7 #include <cstring>
     8 using namespace std;
     9 long long n,t[100],f[100];
    10 string s;
    11 int main(void)
    12 {
    13     cin>>n;
    14     t[0]=f[0]=1;
    15     for(int i=1;i<=n;++i)
    16     {
    17         cin>>s;
    18         if(s=="AND")
    19         {
    20             t[i]=t[i-1];
    21             f[i]=2*f[i-1]+t[i-1];
    22         }
    23         else
    24         {
    25             f[i]=f[i-1];
    26             t[i]=2*t[i-1]+f[i-1];
    27         }
    28     }
    29     cout<<t[n]<<endl;
    30     return 0;
    31 }

    E:

    给出N个点的坐标以及M次操作和Q次询问,操作顺序执行,求每次询问的b点在经过a次操作后的坐标。

    分析:假设点的坐标为x,y,那么经过每个操作得到的坐标如下:

          op=1:(y,-x)   op=2:(-y,x)   op=3:(2p-x,y)   op=4:(x,2p-y)

          我们只关心每个点变换的最终结果,且由上面的表达式可以知道x,y都为线性变换,因此最终的结果必然为(k1x+C1,k2y+C2)。所以我们记录每次操作后五个参数的值(k1,k2,c1,c2,是否交换坐标sw),每次询问将点的坐标带进去即可。

     1 #include <iostream>
     2 #include <vector>
     3 #include <algorithm>
     4 #include <queue>
     5 #include <vector>
     6 #include <cstdlib>
     7 #include <cstring>
     8 typedef long long ll;
     9 using namespace std;
    10 int n,m,q,op;
    11 int x[210000],y[210000],sw[210000];
    12 pair<ll,ll> xc[210000];
    13 pair<ll,ll> yc[210000];
    14 int main(void)
    15 {
    16     xc[0]={1,0};
    17     yc[0]={1,0};
    18     sw[0]=0;
    19     cin>>n;
    20     for(int i=1;i<=n;++i)cin>>x[i]>>y[i];
    21     cin>>m;
    22     for(int i=1;i<=m;++i)
    23     {
    24         cin>>op;
    25         if(op==1)
    26         {
    27             sw[i]=1-sw[i-1];
    28             xc[i]=yc[i-1];
    29             yc[i]=xc[i-1];
    30             yc[i].first*=-1;
    31             yc[i].second*=-1;
    32         }
    33         if(op==2)
    34         {
    35             sw[i]=1-sw[i-1];
    36             xc[i]=yc[i-1];
    37             yc[i]=xc[i-1];
    38             xc[i].first*=-1;
    39             xc[i].second*=-1;
    40         }
    41         if(op==3)
    42         {
    43             int p;
    44             cin>>p;
    45             sw[i]=sw[i-1];
    46             xc[i]=xc[i-1];
    47             yc[i]=yc[i-1];
    48             xc[i].first*=-1;
    49             xc[i].second*=-1;
    50             xc[i].second+=2*p;
    51         }
    52         if(op==4)
    53         {
    54             int p;
    55             cin>>p;
    56             sw[i]=sw[i-1];
    57             xc[i]=xc[i-1];
    58             yc[i]=yc[i-1];
    59             yc[i].first*=-1;
    60             yc[i].second*=-1;
    61             yc[i].second+=2*p;
    62         }
    63     }
    64     cin>>q;
    65     for(int i=1;i<=q;++i)
    66     {
    67         int a,b;
    68         cin>>a>>b;
    69         ll ansx=x[b],ansy=y[b];
    70         if(sw[a])swap(ansx,ansy);
    71         ansx*=xc[a].first;
    72         ansx+=xc[a].second;
    73         ansy*=yc[a].first;
    74         ansy+=yc[a].second;
    75         cout<<ansx<<" "<<ansy<<endl;
    76     }
    77     return 0;
    78 }

    F:

    从第0格走到或经过第n个格子,每次移动从1到m任选一个数字,有k个陷阱点,当走到陷阱点时会回到第0格,求到达终点的期望。

    补题。

     1 #include <iostream>
     2 #include <vector>
     3 #include <algorithm>
     4 #include <queue>
     5 #include <vector>
     6 #include <cstdlib>
     7 #include <cstring>
     8 #include <cmath>
     9 typedef long long ll;
    10 const int mod=1e9+7;
    11 using namespace std;
    12 int n,m,k,x,vit[210000];
    13 double a[210000],b[210000],suma,sumb;
    14 int main(void)
    15 {
    16     cin>>n>>m>>k;
    17     for(int i=1;i<=k;++i)
    18     {
    19         cin>>x;
    20         vit[x]=1;
    21     }
    22     for(int i=n-1;i>=0;i--)
    23     {
    24         if(vit[i])
    25         {
    26             a[i]=1;
    27             b[i]=0;
    28         }
    29         else
    30         {
    31             a[i]=suma/m;
    32             b[i]=sumb/m+1;
    33         }
    34         suma+=a[i]-a[i+m];
    35         sumb+=b[i]-b[i+m];
    36     }
    37     if(fabs(a[0]-1.0)<1e-7)printf("-1
    ");
    38     else printf("%.6f
    ",b[0]/(1-a[0]));
    39     return 0;
    40 }
  • 相关阅读:
    设计模式之工厂模式(Factory Pattern)用C++实现
    读书笔记之Effective C++ 1.让自己习惯C++
    LeetCode之RemoveDuplicates扩展
    一致性哈希(Consistent Hashing)原理和实现(整理)
    LeetCode之Remove Duplicates from Sorted Array
    C++小结
    HTTP、HTTP1.0、HTTP1.1、HTTP2.0——笔记
    《趣谈网络协议》——问答笔记
    技术源于生活(头脑风暴)
    解决:未能加载文件或程序集“System.Web.Http, Version=5.2.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
  • 原文地址:https://www.cnblogs.com/yanying7/p/14321822.html
Copyright © 2020-2023  润新知