Cdoefroces #354
A题
题意:给定一些数,然后求一次交换以后最大的数和最小的数之间的最大距离
分析:找到最大数和最小数的位置,然后判断是把位置大的移到最后还是把位置小的移到开始位置即可
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <vector> 6 #include <algorithm> 7 #include <set> 8 #include <map> 9 #include <bitset> 10 #include <cmath> 11 #include <queue> 12 #include <stack> 13 using namespace std; 14 const int maxn=200; 15 int a[maxn]; 16 int main() 17 { 18 int n; 19 while(cin>>n) 20 { 21 int minx,maxx; 22 for(int i=1;i<=n;i++) 23 cin>>a[i]; 24 for(int i=1;i<=n;i++){ 25 if(a[i]==1) 26 { 27 minx=i; break; 28 } 29 } 30 for(int i=1;i<=n;i++){ 31 if(a[i]==n){ 32 maxx=i; break; 33 } 34 } 35 if(minx>maxx) 36 swap(minx,maxx); 37 cout<<maxx-minx+max(minx-1,n-maxx)<<endl; 38 } 39 return 0; 40 }
B题
题意:给定一些倒香槟的杯子,第一层1个,第二层2个,依此下去,问第t秒有多少个杯子水是满的
分析:为了考虑精度问题,我们将t乘1024,然后进行模拟,对每1秒流下的水,到下下一层以后一定会变成(a[i][j]-1)/2
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <vector> 6 #include <algorithm> 7 #include <set> 8 #include <map> 9 #include <bitset> 10 #include <cmath> 11 #include <queue> 12 #include <stack> 13 using namespace std; 14 const int maxn=15; 15 const int inf=1<<10; 16 int a[maxn][maxn]; 17 int n,t; 18 int main() 19 { 20 while(cin>>n>>t) 21 { 22 memset(a,0,sizeof(a)); 23 a[1][1]=t*inf; 24 int ans=0; 25 for(int i=1;i<=n;i++) 26 for(int j=1;j<=i;j++){ 27 if(a[i][j]>=inf){ 28 ans++; 29 a[i+1][j]+=(a[i][j]-inf)/2; 30 a[i+1][j+1]+=(a[i][j]-inf)/2; 31 } 32 } 33 cout<<ans<<endl; 34 } 35 return 0; 36 }
C题
题意:给定一个字符串,可以改变其中k个字母,问最大的重复字串长度,字符串只含有a和b
分析:这题是一个原题,对于区间[l,r],看其上0的数量是否大于k,若小于k,则[l+1,r]必然也小于k,统计[1,n]上的最大长度即可。统计的时候用二分思想,然后分别对a和b进行统计,最后求其最大值即可。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <vector> 6 #include <algorithm> 7 #include <set> 8 #include <map> 9 #include <bitset> 10 #include <cmath> 11 #include <queue> 12 #include <stack> 13 using namespace std; 14 const int maxn=100010; 15 char s[maxn]; 16 int a[maxn],b[maxn],dp1[maxn],dp2[maxn]; 17 int n,k; 18 int main() 19 { 20 while(cin>>n>>k) 21 { 22 memset(dp1,0,sizeof(dp1)); 23 //memset(a,0,sizeof(a)); 24 scanf("%s",s); 25 for(int i=0;i<n;i++){ 26 int t=i; 27 if(s[i]=='a') 28 a[++t]=1; 29 else 30 a[++t]=0; 31 } 32 //for(int i=1;i<=n;i++) 33 // cout<<a[i]; 34 //cout<<endl; 35 for(int i=1;i<=n;i++){ 36 if(!a[i]) 37 dp1[i]=dp1[i-1]+1; 38 else 39 dp1[i]=dp1[i-1]; 40 41 } 42 int left1=0,right1=0,mx1=0,j1=0; 43 for(int i=1;i<=n;i++){ 44 while(dp1[i]-dp1[j1]>k) j1++; 45 if(mx1<i-j1){ 46 mx1=i-j1; 47 left1=j1+1; 48 right1=i; 49 } 50 } 51 52 memset(dp2,0,sizeof(dp2)); 53 //memset(b,0,sizeof(b)); 54 for(int i=0;i<n;i++){ 55 int h=i; 56 if(s[i]=='b') 57 b[++h]=1; 58 else b[++h]=0; 59 } 60 61 for(int i=1;i<=n;i++){ 62 if(!b[i]) 63 dp2[i]=dp2[i-1]+1; 64 else 65 dp2[i]=dp2[i-1]; 66 } 67 int left2=0,right2=0,mx2=0,j2=0; 68 for(int i=1;i<=n;i++){ 69 while(dp2[i]-dp2[j2]>k) j2++; 70 if(mx2<i-j2){ 71 mx2=i-j2; 72 left2=j2+1; 73 right2=i; 74 } 75 } 76 cout<<max(mx1,mx2)<<endl; 77 } 78 return 0; 79 }