群赛4总结----2017.9.6

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 1000000007
long 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);
}(代码是抄的,自己还在琢磨中)

网址:这一题

小结:

**此类题目较难。**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值