群赛2总结-----2017.9.4

来源:互联网 发布:商城数据统计公式 编辑:程序博客网 时间:2024/06/05 22:51

  • T1 Odds and Ends
    • 题意
    • 解法
    • 代码
    • 网址这一题
    • 小结
  • T2 Tell Your World
    • 题意
    • 解法
    • 代码
    • 网址这一题
    • 小结
  • T3 From Y to Y
    • 题意
    • 解法
    • 代码
    • 网址这一题
    • 小结
  • T4 Harmony Analysis
    • 题意
    • 解法
    • 代码
    • 网址这一题
    • 小结
  • T5 Bear and Prime Numbers
    • 题意
    • 解法
    • 代码
    • 网址这一题
    • 小结

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

网址:这一题

小结:

**此类题目需要特判。**
原创粉丝点击