奋斗群群赛—4
T1:Arpa and a research in Mexican wave
题目位置:
题意:
有一排观众席,有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
题目位置:
题意:
纸上有三个点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
题目位置:
题意:
讲了什么向量的鬼东西,但是如果将题意理解了就会发现是十分简单的,只要一点的算法优化,就不会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
题目位置:
题意:
给你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!