牛客——黑魔法师
鏈接:https://www.nowcoder.com/acm/contest/215/A
來源:牛客網
?
時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 262144K,其他語言524288K
64bit IO Format: %lld
題目描述
“White shores, and beyond. A far green country under a swift sunrise.”--灰魔法師
給出長度為n的序列a, 求有多少對數對 (i, j) (1 <= i < j <= n) 滿足 ai + aj 為完全平方數。
輸入描述:
第一行一個整數 n (1 <= n <= 105) 第二行 n 個整數 ai (1 <= ai <= 105)輸出描述:
輸出一個整數,表示滿足上述條件的數對個數。示例1
輸入
復制
3 1 3 6輸出
復制
2說明
滿足條件的有 (1, 2), (2, 3) 兩對。?這個是牛客上的一個小比賽的簽到題,是最簡單的一道,而且過得人也比較多,當時我感覺我也能坐,最后我發現我想多了,寫了半年也沒有寫出來,其實寫是非常好寫的,但是就是容易超時,所以必須優化,最后還是看了別人的代碼才把這道題給敲了出來,唉,歸根究底還是自己太菜了吧,以后繼續好好的刷題吧,沒有什么是·一蹴而就的,下面給出AC代碼。
#include<stdio.h> #include<string.h> using namespace std; #define ll long long ll a[5000] ; ll b[100007]; int main() {memset(b,0,sizeof(b));ll n,cnt,m;cnt=1;for(ll i=1;i*i<=200000;i++)a[cnt++]=i*i; //打表,先把平方的值給打印下來;scanf("%lld",&n);for(ll i=1;i<=n;i++){scanf("%lld",&m);b[m]++;} //因為是100000個數,而且每個//數的值都小于100000,所以我們可以判斷出里面會有很多的重復的數字,把那些重復的數字統計起來,減小運行的時間;ll ans1=0,ans2=0;for(ll i=1;i<cnt;i++){for(ll j=1;j<=100000;j++){if(b[j]==0)continue;ll tmp=a[i]-j;if(tmp>100000) continue;if(tmp<=0) break;if(b[tmp]){if(tmp==j) ans1+=(b[j]*(b[j]-1))/2;else ans2+=b[j]*b[tmp];}}}ans1=ans1+ans2/2;printf("%lld",ans1);return 0; }?
總結
- 上一篇: Blackberry Windows+
- 下一篇: 不容错过 家具模型3d模型素材推荐