【NOIP2015模拟】终章-剑之魂
背景介紹
古堡,暗鴉,斜陽(yáng),和深淵……
等了三年,我獨(dú)自一人,終于來(lái)到了這里……
“終焉的試煉嗎?就在這里嗎?”我自言自語(yǔ)道。
“終焉的試煉啊!就在這里啊!”我再一次自言自語(yǔ)道。
“這背后可能有那個(gè)東西嗎?”我自言自語(yǔ)道。
“這背后一定有那個(gè)東西呢!”我又一次自言自語(yǔ)道。
我沉默著,踏上黑漆漆的索橋,小心翼翼地,拿出鋒利的注入我靈魂的雙劍……
“那么,我們開(kāi)始吧……”我最后一次自言自語(yǔ)道。
題目描述
My soul of my sowrd!
終焉的試煉即將到來(lái),作為一名有修養(yǎng)的劍士,雖然沒(méi)有習(xí)得n刀流但是二刀流還是沒(méi)問(wèn)題的。然而我也是個(gè)劍的收藏者,家里屯著n把劍,每一把劍都有一個(gè)靈魂值a[i],由于一些劍之間可能有共鳴,所以我需要兩把契合度最高的劍。據(jù)劍圣所說(shuō),兩把編號(hào)為i,j劍的契合度為a[i] and a[j]。如何深得劍的靈魂呢?
注:AND 為按位與運(yùn)算,先將數(shù)轉(zhuǎn)成二進(jìn)制,不滿位數(shù)的補(bǔ)全0,然后成為兩個(gè)長(zhǎng)度相同的二進(jìn)制數(shù),處理的時(shí)候,兩個(gè)相應(yīng)的二進(jìn)制位都為1,該位的結(jié)果值才為1,否則為0。例:0101(5) and 0011(3)=0001(1)
輸入
第一行一個(gè)整數(shù)n,代表藏劍數(shù)。
第二行n個(gè)整數(shù),第i個(gè)整數(shù)表示a[i]。
輸出
輸出包含一個(gè)正整數(shù),最好的兩把劍的契合度。
思路
我們先測(cè)試幾組數(shù)據(jù)。1.6 and 4=4. 2.6 and 2=2. 3.4 and 2=0.不難發(fā)現(xiàn),兩個(gè)數(shù)越大,運(yùn)算出來(lái)結(jié)果越大。由此得出解法。
解法+時(shí)間復(fù)雜度
先從大到小快排(n log n),再n^2枚舉。WTF!這你都過(guò)了?別急,聽(tīng)完嘛。如果我們and出來(lái)的數(shù)沒(méi)上一次大,后面的數(shù)and出來(lái)一定沒(méi)有這次大,我們就可以break了。所以總時(shí)間復(fù)雜度為O(n log n+玄(學(xué)))
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int n,i,u,k,a[1000001],b[1000001][32],xh,h[32][32],j,o[1000001]; long long ans; bool bz,bj[1000001]; int ks(long long x) {if (x==0) return 1;if (x==1) return 2; else{int s=x%2;if (s==1) return ks(x/2)*ks(x/2)*2;else return ks(x/2)*ks(x/2);} } int main() {freopen("sword.in","r",stdin);freopen("sword.out","w",stdout);scanf("%d",&n);for (i=1;i<=n;i++){scanf("%d",&a[i]);while (a[i]!=0){b[i][0]++;b[i][b[i][0]]=a[i]%2;a[i]/=2;}xh=max(xh,b[i][0]);h[b[i][0]][0]++;h[b[i][0]][h[b[i][0]][0]]=i;}bz=0;for (i=xh;i>=1;i--){if (bz==0) {k+=h[i][0];for (j=1;j<=h[i][0];j++){bj[h[i][j]]=1;}}u=0;for (j=1;j<=n;j++)if (b[j][i]==1 && bj[j]==1) u++;else{o[0]++;o[o[0]]=j;}if (u>=2) {ans+=ks(i-1);for (j=1;j<=o[0];j++)bj[o[j]]=0;bz=1;}memset(o,0,sizeof(o));}printf("%lld",ans); }轉(zhuǎn)載于:https://www.cnblogs.com/Sport-river/p/10390133.html
總結(jié)
以上是生活随笔為你收集整理的【NOIP2015模拟】终章-剑之魂的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: vue如何通过NodeJs本地获取微信a
- 下一篇: Ubuntu怎么知道去哪找安装软件?