奋斗群群赛---4

奋斗群群赛—4

T1:Arpa and a research in Mexican wave

题目位置:

T1位置所在

题意:

有一排观众席,有n个人,当t=1时第一个人站起来,t=2时第二个人站起来,t=3时第三个人站起来……到k位置,都是站起来,但是k+1时k+1的人站起来,而编号为1的人坐下,k+2时为k+2的人站起来,标号为2的人坐下…问输入一个时间,此时有多少人站着的!

AC代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n,k,t;
    scanf("%d%d%d",&n,&k,&t);

    if(t<=k)
    {
        printf("%d\n",t);
        return 0;
    }
    else if(t>k&&t<=n)
    {
        printf("%d",k);
        return 0;
    }
    else if(t>n)
    {
        printf("%d",max(k-(t-n),0));
        return 0;
    }
}

小反思:

无——水题一道啊!只是记住,在n+k之后是0个人站着,不会有负数的情况出现的

T2:Arpa and an exam about geometry

题目位置:

T2位置所在

题意:

纸上有三个点a, b, c,问有没有可能找到另一个点,将纸张绕着这个点选择一定角度后a与原来的b点重复,b与原来的c点重复。所以根据全等的概念,有SAS可以知道是1->2的距离一定要等于2->3的距离,但是仔细想想,还不能在一条线(为什么?自己想,哈哈!)

AC代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    long long int x1,y1,x2,y2,x3,y3;
    cin>>x1>>y1>>x2>>y2>>x3>>y3;

    double dis1,dis2;

    dis1=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
    dis2=(x2-x3)*(x2-x3)+(y2-y3)*(y2-y3);


    if(dis1!=dis2)
    {
        cout<<"NO";
        return 0;
    }
    else
    {
        if((y1-y2)*(x2-x3)!=(x1-x2)*(y2-y3))
            cout<<"YES";
        else cout<<"NO";

    }
}

小反思:

应该将斜率公式来变成乘法,这也证实了代码最好别除,真的!

T3:Five Dimensional Points

题目位置:

T3位置所在

题意:

 讲了什么向量的鬼东西,但是如果将题意理解了就会发现是十分简单的,只要一点的算法优化,就不会TLE了!

在五维空间下给你n个点,然你求有多少个好点分别是什么.
好点:任意两个不同于这个点的点,如果其与改点相连后的夹角大于等于90
坏点:存在小于90的.

#include <bits/stdc++.h>
using namespace std;
int a[10005][6],book[3005];
int f(int x,int b,int c)
{
    int tot=0;
    for(int i=1; i<=5; i++)
        tot+=(a[x][i]-a[b][i])*(a[x][i]-a[c][i]);
    return tot;
}
int main()
{
    int n,all=0;
    scanf("%d",&n);

    for(int i=1; i<=n; i++)
        scanf("%d%d%d%d%d",&a[i][1],&a[i][2],&a[i][3],&a[i][4],&a[i][5]);

    for(int i=1; i<=n; i++)
    {
        int tot=0,flag=0;

            for(int j=1; j<=n; j++)
            {
                for(int v=1; v<=n; v++)
                    if(i!=j&&j!=v&&v!=i)
                    {

                        if(f(i,j,v)<=0)
                            tot++;
                        else if(f(i,j,v)>0)
                        {
                            flag=1;
                            break;
                        }

                    }
                if(flag==1)
                    break;
            }
        if(tot==(n-1)*(n-2))
        {
            all++;
            book[i]=1;
        }
    }
    cout<<all<<endl;
    for(int i=1; i<=n; i++)
        if(book[i]==1)
            cout<<i<<endl;
}

小反思:

第一次错了主要是因为没有很好的优化,即出现一个坏的点的时候就可以直接的将它给break掉了,否则判到尾还是会TLE,即(1,3,2)与(1,2,3)是一起判断的,所以根据公式,出现(n-1)*(n-2) 的可能就是符合了的!

T4:Polycarpus’ Dice

题目位置:

T4题目位置

题意:

给你n个骰子,然后每个骰子有d[i]面,给你一个a,a表示这n个骰子所扔的点数和
然后问你,每一个骰子有多少个数不能投掷到~

AC代码:

#include <bits/stdc++.h>
using namespace std;
long long int dice[200005];
int main()
{
    long long int n,s,tot=0,all;
    cin>>n>>s;

    for(int i=1; i<=n; i++)
    {
        cin>>dice[i];
        tot+=dice[i];
    }
//cout<<tot<<" tot"<<endl;
    for(int i=1; i<=n; i++)
    {
        long long int ans;
        ans=min((s+(long long int)1-n),dice[i])-max((s+dice[i]-tot),(long long int)1)+1;
        ans=dice[i]-ans;
        cout<<ans<<" ";
    }
}

小反思:

一定要推公式,不然又会TLE的!

总结

1.学会推公式
2.多考虑边界情况
3.灵活考虑剪枝的情况,可以方便不会TLE!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值