乙個數x可以按以下規則生成數字:
1、將任意兩位交換,若交換的數字為a和b,生成的代價為((a and b)+(a xor b))*2 。
例如134可以生成431,因為431可以從134的個位(4)與百位(1)交換後得到,代價為((1 and 4)+(1 xor 4))*2=10。
2、將其中一位數刪除,但是刪除的數要滿足大等於它左邊的數,且小等於它右邊的數,並且定義最高位左邊的數為個位,個位右邊的數為最高位。若刪除的數字為a,它左邊的數為b,它右邊的數為c,則生成的代價為a+(b and c)+(b xor c)。
例如212,可以刪除個位的數得到21,但是因為2>1,所以1是不能被刪除的。特別地,若x為兩位數,它能刪除當且僅當x的兩位數相同,若x為一位數,它是不能被刪除的。
3、在兩位數字之間,也可以是數字的前面或後面加入一位數,同樣地,加入的數要滿足大等於它左邊的數,且小等於它右邊的數,並且定義最高位左邊的數為個位,個位右邊的數為最高位。若加入的數字為a,它左邊的數為b,它右邊的數為c,則生成的代價為a+(b and c)+(b xor c)。
例如241,它可以在2與4之間加入乙個3,生成2341,也可以在數的末尾加入乙個1或者2,當然還有其它可以生成的數,但是不能在4和1之間加入數字。
你的任務是,s一開始為n個不同的給定數組成的集合,每次可以從s中取出乙個數生成乙個滿足生成規則的數加入s中,並且取出的數仍然存在於s中。生成的數的位數不能大於s初始集合最大的數的位數。問在s元素最多的情況下,總代價最小是多少。
輸入的第1行為乙個正整數n,為集合s初始元素個數。
第2行包含n個正整數a1,a2, ..., an,數之間空格隔開,為s中初始元素。
輸出包括乙個正整數,為最小代價。
思路:如果a能生成b,那麼b也可以生成a,首先我們從n個數裡面bfs去生成其他數字,將代價建為邊,由於要求最小的生成所有數的代價,因此很容易想到最小生成樹,建乙個0節點,對初始n個數字建邊,邊權為0,做最小生成樹即可。
1 #include2 #include3 #include4 #include5 #include6#define ll long long
7struct
edgee[200005
];10
int vis[1000005],c[1000005],b[1000005],n,tot,fa[200005
],mx,h,t;
11bool
cmp(edge a,edge b)
14int find(int
x)18
void
mst()
24 std::sort(e+1,e+1+tot,cmp);
25for (int i=0;i<=100000;i++) fa[i]=i;
26 ll ans=0;27
for (int i=1;i<=tot;i++)
33 printf("
%lld\n
",ans);34}
35int query(int
x)40
return
cnt;41}
42void work(int
x)48
49for (int i=0;i)
50for (int j=i+1;j)
61if (len>2
)74 }else
75if (len==2)83
}84}85
for (int i=0;i)99}
100int l=b[0],r=b[len-1
];101
for (int j=l;j<=r;j++)
111}
112int
main()
120 mx=std::max(mx,cnt);
121 vis[c[i]]=1
;122
}123 h=1,t=n;
124while (h<=t)
128for (int i=1;i<=t;i++)
129 printf("
%d\n
",c[i]);
130mst();
131 }
數字DP 數字遊戲
科協裡最近很流行數字遊戲。某人命名了一種不降數,這種數字必須滿足從左到右個位數字呈現小於等於的關係,如123,446.現在大家決定玩乙個遊戲,指定乙個整數閉區間 a,b 問這個區間內有多少個不降數。輸入多組測試資料。每組只包含兩個數字a和b 1 a,b 2 31 每行給出乙個測試資料的答案,即 a,...
數字DP 數字遊戲
科協裡最近很流行數字遊戲。某人命名了一種不降數,這種數字必須滿足從左到右各位數字呈非下降關係,如 123,446。現在大家決定玩乙個遊戲,指定乙個整數閉區間 a,b 問這個區間內有多少個不降數。輸入格式 輸入包含多組測試資料。每組資料佔一行,包含兩個整數 a 和 b。輸出格式 每行給出一組測試資料的...
數字遊戲題解
題目描述 丁丁最近沉迷於乙個數字遊戲之中。這個遊戲看似簡單,但丁丁在研究了許多天之後卻發覺原來在簡單的規則下想要贏得這個遊戲並不那麼容易。遊戲是這樣的,在你面前有一圈整數 一共n個 你要按順序將其分為m個部分,各部分內的數字相加,相加所得的m個結果對10取模後再相乘,最終得到乙個數k。遊戲的要求是使...