羣賽2總結-----2017.9.4

T1 Odds and Ends

題意:

將n個數字分成奇數份,每份首尾均爲奇數,可以輸出“Yes”。

解法:

循環遞歸。

代碼:

#include<bits/stdc++.h>
using namespace std;
int x[1000000];
bool y[100000];
int main() {
    int a,b=0,c,tou=0,wei=0;
    cin>>a;
    c=a;
    y[a]=true;
    for(int i=0; i<a; i++) {
        cin>>x[i];
        if(x[i]%2!=0) {
            y[i]=true;
        }
    }//cout<<a;
    if(y[0]!=true||a%2==0||y[a-1]!=true)
        cout<<"No";
    else {
        while(wei!=c) {
            for(int i=a/2; i>=0; i--)
                if(y[tou]==true&&y[wei+i*2]==true&&y[wei+i*2+1]==true) {
                    b++;
                    y[tou]=false;
                    y[wei+i*2]=false;
                    tou=wei+i*2+1;
                    wei=tou;
                    a=a-2*i;
                }
        }
        if(b%2!=0)
            cout<<"Yes";
        else
            cout<<"No";
    }
    return 0;
}

網址:這一題

小結:

**此類題目需要特判。**

T2 Tell Your World

題意:

輸入n個數字,在平面上構成n個以(i,Xi)爲座標的點,問是否可以將這些點連成兩條不重疊的平行線?可以輸出"YES".

解法:

利用斜率.

代碼:

#include<bits/stdc++.h>  
using namespace std;  
int s[3000],n;  
bool judge(double k)  
{  
    int p=-1;  
    for(int i=2; i<=n; i++)  
    {  
        if(s[i]-s[1]==(i-1)*k)  
            continue;  
        if(p==-1)  
            p=i;  
        else if(s[i]-s[p]!=(i-p)*k)  
            return 0;  
    }  
    return p!=-1;  
}  
int main()  
{  
    while(scanf("%d",&n)!=EOF)  
    {  
        for(int i=1; i<=n; i++)  
            scanf("%d",&s[i]);  
        if(judge(s[2]-s[1])||judge((s[3]-s[1])*1.0/2)||judge(s[3]-s[2]))  
            printf("Yes\n");  
        else  
            printf("No\n");  

    }  
}  

網址:這一題

小結:

**此類題目需要特判。**

T3 From Y to Y

題意:

輸入一個數字a,用特定的方法輸出一串字符,使他的價值爲a.(具體詳見原題)

解法:

遞歸.

代碼:

#include<bits/stdc++.h>
using namespace std;
int f(int a) {
    int x=0;
    x+=(a+1)*a/2;
    return x;
}
int main() {
    int a;
    char b='a';
    cin>>a;
    if(a==0)
        cout<<b;
    else {
        while(a!=0) {
            for(int i=0; i<=477; i++)
                if(f(i)<=a&&f(i+1)>a) {
                    a-=f(i);
                    for(int j=1; j<=i+1; j++)
                        cout<<b;
                    b++;
                }
        }
    }
    return 0;
}

網址:這一題

小結:

**此類題目需要特判。**

T4 Harmony Analysis

題意:

輸入一個數字a,用特定的方法輸出一串字符,使他的價值爲a.(具體詳見原題)

解法:

近似分型.

代碼:

#include<bits/stdc++.h>
using namespace std;
char x[1000][1000];
int main() {
    int a,b=2;
    x[1][1]='+';
    x[1][2]='+';
    x[2][1]='+';
    x[2][2]='*';
    cin>>a;
    if(a==0)
    {cout<<"+";
    return 0;
    }
    while(a!=1) {
        for(int i=1; i<=b; i++)
            for(int j=1; j<=b; j++) {
                x[i+b][j]=x[i][j];
                x[i][j+b]=x[i][j];
                if(x[i][j]=='+')
                x[i+b][j+b]='*';
                else
                x[i+b][j+b]='+';
            }
        b=b*2;
        a--;        
    }
    for(int i=1;i<=b;i++)
    {
        for(int j=1;j<=b;j++)
    cout<<x[i][j];
    cout<<endl;
    }
    return 0;
}

網址:這一題

小結:

**此類題目可以先手算找規律。**

T5 Bear and Prime Numbers

題意:

輸入n,再輸入n個整數,出入m,以下m行,每行2個整數,表示一個範圍.輸出範圍內質數再數列n中出現的次數和.

解法:

篩法求質數+優化+暴力模擬.

代碼:

#include<stdio.h>  
#include<string.h>  
#define M 10000010  
int b[M],count[M];  
bool visit[M];  
int num=0;  
void init_prim()  
{  
    memset(visit,true,sizeof(visit));  
    for(int i=2; i<M;++i)  
    {  
        if(visit[i]==true)  
        {  
            if(b[i])count[i]+=b[i];  
            for(int j=i*2; j<M; j+=i)  
            {  
                count[i]+=b[j];
                visit[j]=false;  
            }  
        }  
    }  
    for(int i=2; i<M; i++)  
        count[i]+=count[i-1];  
}  
int main()  
{  
    int n,q,l,r,s;  
    init_prim();  
    while(scanf("%d",&n)!=EOF)  
    {  
        memset(b,0,sizeof(b));  
        for(int i=1; i<=n; i++)  
        {  
            scanf("%d",&s);  
            b[s]++;  
        }  
        init_prim();  
        scanf("%d",&q);  
        for(int cas=0; cas<q; cas++)  
        {  
            scanf("%d%d",&l,&r);  
            if(l>M)l=M-1;  
            if(r>M)r=M-1;  
            printf("%d\n",count[r]-count[l-1]);  
        }  
    }  
    return 0;  
} 

網址:這一題

小結:

**此類題目需要特判。**
發佈了28 篇原創文章 · 獲贊 7 · 訪問量 7040
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章