原因:
自身:
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; }