這個題是對剛才線性基的乙個補充,就是中間有一些小貪心,貪心就很有意思,先按權值排序,然後就瞎搞就行了.
題幹:
description相傳,在遠古時期,位於西方大陸的 magic land 上,人們已經掌握了用魔
法礦石煉製法杖的技術。那時人們就認識到,乙個法杖的法力取決於使用的礦石。
一般地,礦石越多則法力越強,但物極必反:有時,人們為了獲取更強的法力而
使用了很多礦石,卻在煉製過程中發現魔法礦石全部消失了,從而無法煉製
出法杖,這個現象被稱為「魔法抵消」 。特別地,如果在煉製過程中使用超過
一塊同一種礦石,那麼一定會發生「魔法抵消」。
後來,隨著人們認知水平的提高,這個現象得到了很好的解釋。經過了大量
的實驗後,著名法師 dmitri 發現:如果給現在發現的每一種礦石進行合理的編
號(編號為正整數,稱為該礦石的元素序號),那麼,乙個礦石組合會產生「魔
法抵消」當且僅當存在乙個非空子集,那些礦石的元素序號按位異或起來
個同樣的礦石必將發生「魔法抵消」,因為這兩種礦石的元素序號相同,異或起
來為零。
並且人們有了測定魔力的有效途徑,已經知道了:合成出來的法杖的魔力
等於每一種礦石的法力之和。人們已經測定了現今發現的所有礦石的法力值,
並且通過實驗推算出每一種礦石的元素序號。
現在,給定你以上的礦石資訊,請你來計算一下當時可以煉製出的法杖最多
有多大的魔力。
input
第一行包含乙個正整數n,表示礦石的種類數。
接下來 n行,每行兩個正整數numberi 和 magici,表示這種礦石的元素序號
和魔力值。
output
僅包一行,乙個整數:最大的魔力值
sample input 3
110220
330sample output
50hint
由於有「魔法抵消」這一事實,每一種礦石最多使用一塊。
如果使用全部三種礦石,由於三者的元素序號異或起來:
1 xor 2 xor 3 = 0
,則會發生魔法抵消,得不到法杖。
可以發現,最佳方案是選擇後兩種礦石,法力為
20+30=50
。對於全部的資料:n ≤
1000,numberi ≤ 10^18
,magici ≤
10^4
**:
#include#include#include
#include
#include
#include
#include
using
namespace
std;
#define duke(i,a,n) for(int i = a;i <= n;i++)
#define lv(i,a,n) for(int i = a;i >= n;i--)
#define clean(a) memset(a,0,sizeof(a))
const
int inf = 1
<< 30
;typedef
long
long
ll;typedef
double
db;template
void read(t &x)
template
void
write(t x)
struct
node
a[100010
];ll ans = 0
,n;ll p[
100010
];bool
cmp(node a,node b)
void get_num(int
f,ll x)
x ^=p[i];
}if(x != 0
) ans +=a[f].y;
}int
main()
sort(a + 1,a + n + 1
,cmp);
duke(i,
1,n)
printf(
"%lld\n
",ans);
return0;
}/*31 10
2 20
3 30
*/
貪心 線性基 BeiJing2011 元素
輸入 第一行包含乙個正整數n,表示礦石的種類數。接下來 n行,每行兩個正整數numberi 和 magici,表示這種礦石的元素序號 和魔力值。輸出 僅包一行,乙個整數 最大的魔力值 樣例輸入 3 1 10 2 20 3 30 樣例輸出 50用到了線性基,按照權值排序之後再順序進行即可。只要最後異或...
BZOJ 2460 元素 線性基
input 第一行包含乙個正整數n,表示礦石的種類數。接下來 n行,每行兩個正整數numberi 和 magici,表示這種礦石的元素序號 和魔力值。output 僅包一行,乙個整數 最大的魔力值 sample input 3 1 10 2 20 3 30 sample output 50hint ...
BZOJ 2460 元素 線性基 貪心
線性基是一種特殊的基,它通常會在異或運算中出現,它的意義是 通過原集合s的某乙個最小子集s1使得s1內元素相互異或得到的值域與原集合s相互異或得到的值域相同。性質 線性基能相互異或得到原集合的所有相互異或得到的值。線性基是滿足性質1的最小的集合 線性基沒有異或和為0的子集。題意 n個礦石,第i個礦石...