原因:
自身:
1.自己并没有考虑过精度所带来的问题。
2.一定要自己读题,独立思考,末被队友带偏(矛盾出真理)。
3.加强自身基础,提高自身实力。
队伍:
1.队友缺乏独立思考,需要加强。
题目描述:
给你n个球,求在有限次数变化中,球的变化最后稳定在一种状态。
思路:
打表找过规律后发现,稳定状态下球的个数是1,2,3,6,10,15,21.....是以等差数列的前n项和。s=(n+1)*n/2;
思路一:二分模拟(想到了,但是深度不够),没有尝试。
思路二:借二元一次方程。(x+1)*x-2n=0 可以求得x是一整一负的,取整,对于整数取齐下限xx,ans=(xx*xx+xx)/2(但是wa了,double 类的精度问题加一个判断语句即可(测试了后台数据近100组,都对,但就是wa了...比完之后才知道是精度问题,(思维的深度不够,,,))。具体看代码<_^_>....)
wa:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main ()
{
int t;
scanf("%d",&t);
ll n;
int cnt=1;
while (t--)
{
scanf("%lld",&n);
ll ans ;
double x=(sqrt(8*n+1)-1)/2;
ll xx=ll(x);
ans=(xx*xx+xx)/2;
printf("Case #%d: %lld",cnt++,ans);
cout<<endl;
}
return 0;
}
ac:
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
int main ()
{
ll t;
cin>>t;
ll cnt =1;
while (t--)
{
ll n;
cin>>n;
ll ans;
ll x=(sqrt(8*n+1)-1)/2;
ans=x*x+x;
ans/=2;
if(ans>n)
{
ans=x*x-x;
ans/=2;
}
cout<<"Case #"<<cnt++<<": "<<ans<<endl;
}
return 0;
}
ac_two:(其他人的做法:貌似还是精度的问题)
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
int main ()
{
ll t;
cin>>t;
ll cnt =1;
while (t--)
{
ll n;
cin>>n;
ll ans;
ll x=(sqrt((long double)8*n+1)-1)/2;
ans=x*x+x;
ans/=2;
//if(ans>n)
//{
// ans=x*x-x;
// ans/=2;
// }
cout<<"Case #"<<cnt++<<": "<<ans<<endl;
}
return 0;
}