群赛4总结----2017.9.6

来源:互联网 发布:青岛网络 电视台 编辑:程序博客网 时间:2024/05/21 22:47

  • T1 Arpa and a research in Mexican wave
    • 题意
    • 解法
    • 代码
    • 网址这一题
    • 小结
  • T2 Arpa and an exam about geometry
    • 题意
    • 解法
    • 代码
    • 网址这一题
    • 小结
  • T3 Five Dimensional Points
    • 题意
    • 解法
    • 代码
    • 网址这一题
    • 小结
  • T4 Polycarpus Dice
    • 题意
    • 解法
    • 代码
    • 网址这一题
    • 小结
  • T5 Little Elephant and LCM
    • 题意
    • 解法
    • 代码
    • 网址这一题
    • 小结

T1 Arpa and a research in Mexican wave

题意:

有n个人,最多有k个人站起来,每秒都有一个人站起来或者是坐下,详情见题目里的note。

解法:

t小于k的时候直接输出t,t大于n的时候就是k−(t−n)。

代码:

#include<bits/stdc++.h>using namespace std;int main(){    int n,k,t;    cin>>n>>k>>t;    if(t<=k)    cout<<t;    else if(t>k&&t<=n)    cout<<k;    else    cout<<k-(t-n);    return 0;}

网址:这一题

小结:

**此类题目水题。**

T2 Arpa and an exam about geometry

题意:

输入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 Five Dimensional Points

题意:

现在给n个这样的点,现在定义good点:以这个点开始与任何两个点相连都不是锐角。

反之如果有任何一组点组成的连线是锐角就是bad点。

解法:

找规律.

代码:

#include<bits/stdc++.h>using namespace std;int x[1000][1000];int y[12];int g(int a){    int b=0;    for(int i=1; i<=a-2; i++)        b+=i;    return b;}int f(int a,int b,int c){    int d=0;    for(int i=1; i<=5; i++)        d+=(x[b][i]-x[a][i])*(x[c][i]-x[a][i]);    if(d<=0)        return 1;    else        return 0;}int main(){    int a,b=0,c=0;    cin>>a;    for(int i=1; i<=a; i++)        for(int j=1; j<=5; j++)            cin>>x[i][j];    for(int i=1; i<=a; i++)    {        b=0;        int o=0;        for(int j=1; j<=a; j++)        {            for(int k=1; k<=a; k++)            {                if(j<k&&i!=j&&i!=k)                {                    if(f(i,j,k)==1)                        b++;                    if(f(i,j,k)==0)                    {                        o++;                        break;                    }                }            }            if(o!=0)            {                i++;                break;            }        }        if(c==11)        {            cout<<0;            return 0;        }        if(b==g(a))        {            c++;            y[c]=i;        }    }//  cout<<g(10);    cout<<c<<endl;    for(int i=1; i<=c; i++)        cout<<y[i]<<" ";    return 0;}

网址:这一题

小结:

**此类题目需要特判。**

T4 Polycarpus’ Dice

题意:

给你n个骰子,然后每个骰子有d[i]面,给你一个a,a表示这n个骰子所扔的点数和

然后问你,每一个骰子有多少个数不能投掷到~

解法:

找规律.

代码:

#include <bits/stdc++.h>using namespace std;typedef long long LL;const int N = 10000000;LL max6[N];int main(){    LL n, A;    cin >> n >> A ;    LL h = 0;    for(int i = 0; i < n; i++)    {        cin >> max6[i];        h += max6[i];    }    for(int i = 0; i < n; i++)    {        LL ans = 0;        LL hou = A + 1 - n;        if(max6[i] > hou)  ans += (max6[i] - hou);        LL y = A - (h - max6[i]);        if(y > 0)  ans += (y - 1);        cout << ans<<" ";    }    cout << endl;return 0;}

网址:这一题

小结:

**此类题目可以先手算找规律。**

T5 Little Elephant and LCM

题意:

给你一个a序列,找出一个b序列,1=≤bi≤=ai,使得max(bi)=lcm(bi),问这样的bi序列有多少个。

解法:

暴力优化.

代码:

#include<bits/stdc++.h>#include<cmath>using namespace std;#define MAXN 100000#define MOD 1000000007long long a[MAXN+10],n,p[MAXN+10],cnt,ans;void Read(long long &x){    char c;    while((c=getchar())&&c!=EOF){        if(c>='0'&&c<='9'){            x=c-'0';            while((c=getchar())&&c>='0'&&c<='9')                x=x*10+c-'0';            ungetc(c,stdin);            return;        }    }}void isfactor(long long n){    long long t=sqrt(n+0.5),i;    cnt=0;    for(i=1;i<=t;i++)        if(n%i==0)            p[++cnt]=i;    i=cnt;    cnt*=2;    if(t*t==n)        cnt--,i--;    for(;i;i--){        p[cnt-i+1]=n/p[i];    }}long long pow(long long a,long long b){    long long ret=1;    while(b){        if(b&1)            ret=ret*a%MOD;        b>>=1;        a=a*a%MOD;    }    return ret;}int main(){    long long i,j,k,t,s;    Read(n);    for(i=1;i<=n;i++)        Read(a[i]);    sort(a+1,a+n+1);    for(i=1;i<=a[n];i++){        isfactor(i);        t=0;        s=1;        for(j=2;j<=cnt;j++){            k=lower_bound(a+t+1,a+n+1,p[j])-a-1;            s=s*pow(j-1,k-t)%MOD;            t=k;        }        s=s*(pow(cnt,n-t)+MOD-pow(cnt-1,n-t))%MOD;           ans=(ans+s)%MOD;    }    printf("%I64d\n",ans);}(代码是抄的,自己还在琢磨中)

网址:这一题

小结:

**此类题目较难。**
原创粉丝点击