1. 程式人生 > 實用技巧 >Codeforces Round #669 (Div. 2)(A、B)

Codeforces Round #669 (Div. 2)(A、B)

A.Ahahahahahahahaha

題意,給定一個由0,1組成的陣列a,陣列長度為n(n%2==0),要求經過k(k/2)次移除後,使得a1a2+a3a4+=0。

分析:可以記錄下陣列中1的個數,在進行判斷

開始看題的時候我認為移除後的陣列長度只能是偶數,就導致了我在(n%4==0)這一情況下花費了很多時間,最後看樣例才懂。

程式碼:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace
std; 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;
}