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 }