群赛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;  
} 

网址:这一题

小结:

**此类题目需要特判。**
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值