Boxes and Balls UVALive - 7500(練習賽爆零)
阿新 • • 發佈:2017-12-23
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(練習賽爆零)