Codeforces Round #669 (Div. 2)(A、B)
阿新 • • 發佈:2020-09-09
題意,給定一個由0,1組成的陣列a,陣列長度為n(n%2==0),要求經過k(k/2)次移除後,使得a1−a2+a3−a4+…=0。
分析:可以記錄下陣列中1的個數,在進行判斷
開始看題的時候我認為移除後的陣列長度只能是偶數,就導致了我在(n%4==0)這一情況下花費了很多時間,最後看樣例才懂。
程式碼:
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespacestd; const int N=1e3+10; bool f[N]; int main() { int t; scanf("%d",&t); while(t--) { int n; int ant=0; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&f[i]); ant+=f[i]; } if((n/2)%2==0) { printf("%d\n",n/2); if(ant>=n/2)//1的個數超過等於一半,可以將把所有0去除 for(int i=0;i<n/2;i++) printf("1 "); else for(int i=0;i<n/2;i++) printf("0 ");//0的個數超過等於一半,可以將把所有1去除 printf("\n"); } else { if(ant>n/2) { printf("%d\n",n/2+1); for(int i=0;i<n/2+1;i++) printf("1 "); printf("\n"); } else if(ant<n/2) { printf("%d\n",n/2+1); for(int i=0;i<n/2+1;i++) printf("0 "); printf("\n"); } else { printf("%d\n",n/2); for(int i=0;i<n/2;i++) printf("0 "); printf("\n"); } } } return 0; }
B.Big Vova
題意,給定陣列a,讓我們確定a的順序,a中元素順序判斷方法是gcd字典序。
分析:首先陣列b[0]應該為a中元素最大值,其次是與__gcd(b[0],a[i])最大值時的a[i]作為b[1];
解法:暴力解法,依次遍歷即可,但是這中時間複雜度應該是O(t*n2),不知道怎麼過的。
程式碼:
#include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #include<map> using namespace std; const int N=1e3+10; int q[N]; map<int,int>p; int main() { int t; scanf("%d",&t); while(t--) { int n; int b[N]; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&q[i]); p[q[i]]++; } int idx=0; b[0]=*max_element(q,q+n); p[b[0]]--; int x=b[0]; while(idx<n-1) { int tmp=1,val; for(int i=0;i<n;i++) if(p[q[i]]) if(__gcd(x,q[i])>tmp) { tmp=__gcd(x,q[i]); val=q[i]; } if(tmp==1) break; b[++idx]=val; p[val]--; x=tmp; } if(idx<n-1) for(int i=0;i<n;i++) if(p[q[i]]) { b[++idx]=q[i]; p[q[i]]--; } for(int i=0;i<n;i++) printf("%d ",b[i]); printf("\n"); p.clear(); } return 0; }