2016 9 17測試解題報告

2021-07-22 20:16:05 字數 3555 閱讀 3967

這套題真水。

問題描述:

有n個炸彈,有些炸彈牽了一根單向引線(也就是說引線只有在這一端能被炸彈點燃),只要引爆了這個炸彈,用引線連線的下乙個炸彈也會**。每個炸彈還有個得分,當這個炸彈被引爆後就能得到相應得分。

現在要你引爆k個炸彈,使得分最大。

輸入說明:

第1行兩個整數n、k。

接下來n行每行兩個整數a[i]、b[i]。a[i]表示這個炸彈用引線連線的下乙個炸彈,如果a[i]為0,則表示這個炸彈沒連線引線。b[i]表示這個炸彈的得分。

輸出說明:

僅乙個數,表示最大得分。

思路:

很容易看出題目給出的是乙個樹狀的結構。所以分析問題的時候可以把給出的單向邊反過來分析。每一次都從葉節點開始向上更新,一直更新到根結點的f值(即該結點開始的鏈的最大權值)和g值(即最大鏈中該節點所連線的子節點的序號)。然後在引爆的時候,從根節點開始向下引爆(利用剛剛處理出來的變數g),遇到已經被炸的結點就直接跳過。引爆k個節點後統計答案輸出(long long)。

**:

#include

#include

#include

#include

#include

#include

#include

using namespace std;

struct node

}a[200005];

intpos[200005];

int ans_cnt=0;

long long ans=0;

bool cmp(node a,node b)

int n,k;

//性質:如果乙個點沒有被選過,那麼它的最優子節點鏈肯定沒有被選過

int main()

for(int i=1;i<=n;i++) if(!a[i].outdge)

pos=a[pos].pre;}}

sort(a+1,a+1+n,cmp);

for(int i=1;i<=n;i++) pos[a[i].num]=i;

for(int i=1;i<=n;i++) if(!a[i].u)

}printf("%i64d",ans);

fclose(stdin);

fclose(stdout);

return

0;}

問題描述:

有n個石子圍成一圈,每個石子都有乙個權值a[i],你需要取一些石子,每個石子的得分是a[i]*d,d表示這個石子到兩邊被取了的石子的距離和。現在你可以取若干石子,使得分最大。

輸入說明:

第1行乙個整數n。

接下來n行,每行乙個整數a[i]。

輸出說明:

僅乙個整數,表示最大得分。

思路:

由數學證明可知,得出最大解的方案只可能是拿走乙個石子或者兩個石子。計算即可。

**:

#include

#include

using

namespace

std;

int n;

long

long fir=0,sec=0;

int main()//數學題

if(fir>(n-2)*sec) printf("%i64d",fir*(n-1));

else

printf("%i64d",(fir+sec)*(n-2));

fclose(stdin);

fclose(stdout);

return

0;}

問題描述:

118號工廠是世界唯一秘密提煉鉲的化工廠,由於提煉鉲的難度非常高,技術不是十分完善,所以工廠生產的鉲成品可能會有3種不同的純度,a:100%,b:1%,c:0.01%,為了**方便,必須把不同純度的成品分開裝箱,裝箱員grant第1次順序從流水線上取10個成品(如果一共不足10個,則全部取出),以後每一次把手中某種純度的成品放進相應的箱子,然後再從流水線上順序取一些成品,使手中保持10個成品(如果把剩下的全部取出不足10個,則全部取出),如果所有的成品都裝進了箱子,那麼grant的任務就完成了。

由於裝箱是件非常累的事情,grant希望他能夠以最少的裝箱次數來完成他的任務,現在他請你編個程式幫助他。

輸入說明:

第1行為n(1<=n<=100),為成品的數量

以後n行,每行為乙個大寫字母a,b或c,表示成品的純度。

輸出說明:

僅一行,為grant需要的最少的裝箱次數。

思路:

一眼動規。設狀態f[num1][num2][num3][i]為手中由num1個a,num2個b,num3個c,一共現在處理了i個產品時候的最少次數。預處理出各個區間各產品的個數可有狀態轉移方程:

**:

#include

#include

#include

#include

#include

#include

#include

#define min(a,b) ((a)<(b)?(a):(b))

using

namespace

std;

int n;

int num[205][205][4];

int f[25][25][25][205];

void print(int i,int num1,int num2,int num3)

/*for(int k=1;k<=3;k++)

//coutf[num1+num[i+1][i+num2][1]][num[i+1][i+num2][2]][num3+num[i+1][i+num2][3]][i+num2]=min(f[num1+num[i+1][i+num2][1]][num[i+1][i+num2][2]][num3+num[i+1][i+num2][3]][i+num2],f[num1][num2][num3][i]+1);

f[num1+num[i+1][i+num3][1]][num2+num[i+1][i+num3][2]][num[i+1][i+num3][3]][i+num3]=min(f[num1+num[i+1][i+num3][1]][num2+num[i+1][i+num3][2]][num[i+1][i+num3][3]][i+num3],f[num1][num2][num3][i]+1);

//print(i,num1,num2,num3);

}printf("%d",f[0][0][0][n]);

fclose(stdin);

fclose(stdout);

return

0;}

Block Voting 解題報告

這道題做的有點狼狽,效率不高,差一點就tle的ac了。看status裡的,ac的時間大多數都是0ms的。肯定有乙個更有效率的演算法的。下面說下我的狼狽演算法。出處 http acm.jlu.edu.cn joj showproblem.php?pid 1223 問題描述 求每個party的權值。第i...

Safebreaker 解題報告

又是吉林大學一道acm題目,題目很簡單,直接暴力解決。出處 http acm.jlu.edu.cn joj showproblem.php?pid 1718 問題描述 對乙個給定數0000 9999 根據一系列猜測,判斷這個數是否存在,存在的話,是否唯一 例如 3321,給定數 作出猜測,1223 ...

路由 解題報告

路由 問題描述 有乙個tcp ip網路 每台計算機都有乙個或多個網路介面。每個介面根據它的ip位址和子網掩碼來識別 即兩個4位元組的數,兩個字 節之間有乙個 號.子網掩碼有乙個二進位制表示法 有k個 1 然 後是 m 個 0 k m 8 4 32 如 212.220.35.77 是乙個 ip 地 址...