日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

大吉大利【牛客网】(牛客练习赛60)

發布時間:2023/12/3 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大吉大利【牛客网】(牛客练习赛60) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

傳送

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 262144K,其他語言524288K
64bit IO Format:%lld

題目描述

輸入描述:

第一行一個整數n.
第二行n個整數ai.

輸出描述:

一個整數表示上述求和式的答案.
示例1
輸入

5 1 2 3 4 5

輸出

33

備注:
1≤n≤1e5
0≤ai≤1e8

題解:
根據題意就能打出最簡單的暴力方法
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
sum+=a[i]&a[j];
復雜度O(n)肯定超時,這題也不可能這么水。

---------------------------------(此處為做題時錯誤想法)
我一開始這么想的a[i]&a[j] = = a[j]&a[i],所以j循環時從i+1開始就行,因為這個是對稱的,sum算完再*2,最后再加上對角線上的i = = j的情況,結果還是超時(捂臉 )
(以下為正解)
&啥性質?1&1=1,其余情況都為0
當1&2是,我們可以轉化成二進制運算,01&11=01
其實就是對應列&運算,
0 1
&
1 1
——
0 1
我們看樣例:
1 ->0 0 1
2 ->0 1 0
3 ->0 1 1
4 ->1 0 0
5 ->1 0 1
看第一列:
0
0
0
1
1
因為0&任何都是0,所以看1,第四五行有1,
那運算時第四行&第四行=1,第四行&第五行=1,接著第五行再分別與第五行和第四行&運算也是兩個1,最后加起來一共四個1.其實就是這一列1的數量的平方。你試試最后一列是不是也是這樣?
(其實這個就是模仿暴力方法的第二個for循環,i與每個j&運算)
那這樣算例題,結果就是
1 ->0 0 1
2 ->0 1 0
3 ->0 1 1
4 ->1 0 0
5 ->1 0 1
結果->4 4 9
這個449就可以理解成有4個100,4個010,9個001,因為咱們是用二進制運算,要轉換成十進制,
100對應的就是4 =22
010對應的就是2 =21
001對應的就是1 =20
二進制轉換成十進制時要乘以對應位置2的n次方,就是4 * 22 + 4 * 21 + 9 * 20=33
33就是最后結果(各位想明白了嗎? )
代碼

#include<bits/stdc++.h> using namespace std; typedef long long ll; ll n; ll a[10004]; ll w; ll maxn; int max(ll a,ll b) {return a>b?a:b; } int main() {cin>>n;for(int i=1;i<=n;i++){int ant=0;cin>>w;while(w){++ant;if(w&1)a[ant]++;//求出每列1的數量 w>>=1;}maxn=max(ant,maxn);//確定一共有多少列 }ll sum=0;for(int i=1;i<=maxn;i++)sum+=(a[i]*a[i])<<(i-1);cout<<sum;return 0; }

總結

以上是生活随笔為你收集整理的大吉大利【牛客网】(牛客练习赛60)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。