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 }
原文地址:https://www.cnblogs.com/yanying7/p/14321822.html