奋斗群群赛---4

来源:互联网 发布:centos 阿里云 yum源 编辑:程序博客网 时间:2024/06/05 08:28

奋斗群群赛—4

  • 奋斗群群赛4
    • T1Arpa and a research in Mexican wave
      • 题目位置
      • 题意
      • AC代码
      • 小反思
    • T2Arpa and an exam about geometry
      • 题目位置
      • 题意
      • AC代码
      • 小反思
    • T3Five Dimensional Points
      • 题目位置
      • 题意
      • 小反思
    • T4Polycarpus Dice
      • 题目位置
      • 题意
      • AC代码
      • 小反思
    • 总结

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!

原创粉丝点击