A. Co-prime Array
http://codeforces.com/contest/660/problem/A
题意:给出一段序列,插进一些数,使新的数列两两成互质数,求插最少的个数,并输出这个序列。
思路:最优的就是插入1,1与非1的数都互质。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int gcd(int a,int b){ 4 return b==0?a:gcd(b,a%b); 5 } 6 int main(){ 7 int n,t=0,a[2010],b[2010]; 8 scanf("%d",&n); 9 for(int i=0;i<n;i++){ 10 cin>>a[i]; 11 if(gcd(a[i],a[i-1])!=1) 12 b[t++]=1; 13 b[t++]=a[i]; 14 } 15 cout<<t-n<<endl; 16 cout<<b[0]; 17 for(int i=1;i<t;i++) 18 cout<<" "<<b[i]; 19 cout<<endl; 20 return 0; 21 }
B. Seating On Bus
http://codeforces.com/contest/660/problem/B
题意:不是很懂题目意思,看样例找规律好了
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m; 4 int main() 5 { 6 cin>>n>>m; 7 for (int i=1;i<=2*n;i++) 8 { 9 if (2*n+i<=m) 10 cout<<2*n+i<<' '; 11 if (i<=m) 12 cout<<i<<' '; 13 } 14 return 0; 15 }
C. Hard Process
http://codeforces.com/contest/660/problem/C
题意:给你k个机会,每次可以把一个0变成1,然后形成最长的都是1的子序列,输出变换后的序列
思路:dp和二分
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn = 1e6; 4 int n,k; 5 int a[maxn],sum[maxn]; 6 int main() 7 { 8 scanf("%d%d",&n,&k); 9 for(int i=1;i<=n;i++) 10 { 11 scanf("%d",&a[i]); 12 a[i]=1-a[i];//将数字互换是为了后面寻找0最多的序列 13 } 14 for(int i=1;i<=n;i++) 15 sum[i]=sum[i-1]+a[i]; 16 int ans1=0,ans2=0; 17 for(int i=1;i<=n;i++) 18 { 19 int l = i,r = n,ans=0; 20 while(l<=r) 21 { 22 int mid=(l+r)/2; 23 if(sum[mid]-sum[i-1]>k)r=mid-1; 24 else l=mid+1,ans=mid-i+1;//二分找到1尽可能多的地方 25 } 26 if(ans>ans1) 27 { 28 ans1=ans; 29 ans2=i; 30 } 31 } 32 cout<<ans1<<endl; 33 for(int i=ans2;i<=n;i++) 34 { 35 if(ans1==0)break; 36 if(a[i]==1)a[i]=0; 37 if(a[i]==0)ans1--; 38 } 39 for(int i=1;i<=n;i++) 40 cout<<1-a[i]<<" "; 41 }