1. 程式人生 > >Boxes and Balls UVALive - 7500(練習賽爆零)

Boxes and Balls UVALive - 7500(練習賽爆零)

c++ val scan 後臺 sig case bit while 需要

原因:

自身:

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;  
    }  

  

  

Boxes and Balls UVALive - 7500(練習賽爆零)