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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

bnuoj 1065 简单的问题(位运算)

發(fā)布時(shí)間:2025/3/16 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bnuoj 1065 简单的问题(位运算) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡單的問題

Time Limit:?1000ms Case Time Limit:?1000ms Memory Limit:?65536KB
算法的漸進(jìn)時(shí)間復(fù)雜度是算法的運(yùn)行時(shí)間的一種度量方式,通常用運(yùn)行時(shí)間隨輸入規(guī)模的增長而增長的速率來表示。?
時(shí)間復(fù)雜度是評(píng)估一個(gè)算法的重要參考標(biāo)準(zhǔn)。?
比如常見的冒泡排序和選擇排序,時(shí)間復(fù)雜度是O(n^2),而快速排序、歸并排序的時(shí)間復(fù)雜度是O(nlogn)。這兩類算法在實(shí)現(xiàn)的時(shí)候,其運(yùn)行時(shí)間隨著數(shù)據(jù)規(guī)模的增長而增長的速率不同。一般來說到n=10000的規(guī)模的時(shí)候兩類算法的運(yùn)行時(shí)間就會(huì)有顯著差異。?
下面有一個(gè)程序:
-----------------------------------------------
#include<stdio.h>
int main()
{
? ?int n,a[10001];
? ?int T;
? ?int i,j,k;
? ?int ans=0;
? ?scanf("%d",&T);
? ?while(T--)
? ?{
? ? ? ?scanf("%d",&n);
? ? ? ?ans=0;
? ? ? ?for(i=0;i<n;++i)
? ? ? ? ? ?scanf("%d",&a[i]);
? ? ? ?for(i=0;i<n;++i)
? ? ? ? ? ?for(j=0;j<n;++j)
? ? ? ? ? ? ? ?ans+=(a[i]|a[j]);
? ? ? ?printf("%d\n",ans);
? ?}
return 0;
}
-----------------------------------------------
上面這個(gè)程序的時(shí)間復(fù)雜度就是O(n^2)的,輸入規(guī)模增長到原來的n倍,運(yùn)行時(shí)間將會(huì)是原來的n^2倍(兩重循環(huán)內(nèi)部的操作的次數(shù)變?yōu)樵瓉淼膎^2倍)。這樣的程序?qū)τ趎高達(dá)10000的數(shù)據(jù)規(guī)模運(yùn)行時(shí)間顯然太長了,無法達(dá)到我們的要求。所以請(qǐng)你幫忙修改一下這個(gè)程序(只是兩重循環(huán)的部分),降低算法的時(shí)間復(fù)雜度,但是程序的功能不能改變。

Input

測(cè)試數(shù)據(jù)有多組,第一行給出了測(cè)試數(shù)據(jù)的組數(shù)T(T<100)
每組數(shù)據(jù)的第一行有一個(gè)正整數(shù) n (1≤n≤10000)。?
接下來同一行有n個(gè)非負(fù)整數(shù),每個(gè)數(shù)都不超過 2^16范圍。兩個(gè)數(shù)之間用空格分開。

Output

輸出有T行,每行為一個(gè)非負(fù)整數(shù),為每組輸入數(shù)據(jù)的對(duì)應(yīng)輸出,結(jié)果不會(huì)超出32位整數(shù)的范圍。

Sample Input

1 2 18467 6334

Sample Output

70239

這是一道涉及位運(yùn)算的題目。按位或運(yùn)算規(guī)則:1 | 1 = 1, 1 | 0 = 1,0 | 1 = 1, 0 | 0 = 0。

所以可以記錄每個(gè)數(shù)的二進(jìn)制表示每一位上的數(shù)是0還是1,當(dāng)是1時(shí),和其他數(shù)運(yùn)算時(shí)這一位上的結(jié)果就是1.具體請(qǐng)參考代碼。
//s[i]記錄有多少個(gè)數(shù)的第i位上的數(shù)字是1 //flag[i][j]表示第i個(gè)數(shù)的第j位上的數(shù)字是0還是1 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int N = 1e4 + 5; int a[N], s[20], flag[N][20]; int Pow(int x) {if(x == 0)return 1;int ans = 1;for(int i = 1; i <= x; i++)ans *= 2;return ans; } int main() {int t, n, i, j;scanf("%d",&t);while(t--){memset(s, 0, sizeof(s));memset(flag, 0, sizeof(flag));scanf("%d",&n);int ans = 0;for(i = 0; i < n; i++){scanf("%d",&a[i]);int k = a[i];for(j = 0; j <= 16; j++){int r = k % 2;if(r == 1){s[j]++;flag[i][j] = 1;}k /= 2;}}for(i = 0; i < n; i++){for(j = 0; j <= 16; j++){if(flag[i][j] == 1)ans += n * Pow(j);elseans += s[j] * Pow(j);}}printf("%d\n",ans);}return 0; }

總結(jié)

以上是生活随笔為你收集整理的bnuoj 1065 简单的问题(位运算)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。