2016 8 29 LGTB解題報告

2021-07-24 07:51:03 字數 3652 閱讀 2902

考試總結:

1.這道題還是花了不少的時間的,特別是對拍啊之類的,總是放不下,然後有一些實現的問題導致改錯也改了很久;

解決方案:下一次在決定寫程式的時候,一定要先在草稿紙上把實現演算法的流程基本上寫一次,精確到迴圈語句,判斷語句的框架,把所有的情況都完整地考慮一次,確定沒有問題了再寫;

解決方案:在解題時把流程規範化,在證明了演算法正確性以後就放下了,不要總是把它提出來!

2.這道題的資料範圍特別小,所以可以很容易地想到狀壓dp,然後考慮到互質的概念,就基本可以確定用位運算來表示質因數了,但是如果100個數考慮到極值100個數都變成質數的話,狀壓肯定是longlong存不下的,而noip難度很少考到比longlong範圍大的狀壓,所以我最後只寫了40分的程式,並且由於是第一次寫狀壓,所以很榮幸地沒除錯出來,所以新學的知識點還是要做那麼一兩道題的,一是為了熟悉知識點與演算法本質,二也是為了在考場上不至於那麼害怕;然後正解分析了a<=30這個特性之後得出最多取到58,所以這說明,選定了乙個演算法之後就要去規範化地解決問題,比如邊界比如初始化,而不是還盯著那個演算法不知道幹什麼,專注於乙個方面才能把這個方面做好

3.看題;

4.總結得出,我是那種只要檔案和輸入輸出名沒問題,沒登出,仔細讀了題就穩前3的人,當然,我這些方面經常出問題,所以一定要改;

解題報告:

一.lgtb與偶數:

題意:相鄰的數同為奇數可以刪,同為偶數可以刪;

分析:如果遇到可以消的,那麼消了以後也不會有壞的影響,因為如果本來被消的兩個數也可以和另一邊的消除,那麼這兩個數被刪掉後旁邊的數湊在一起也可以被消,反之,則本來也不能被消,所以遇到可以消除的就消除,那麼乙個偶數被消除後留下的肯定是乙個奇數,所以就是線性的演算法了;

注意:在消的過程中可能出現消完的情況,這時之前的奇偶性已經沒有用了,要特殊情況考慮;

**:#include

#include

#include

using namespace std;

const int maxn=2e9;

int tmp,n,f,***;

int main()

freopen("even.in","r",stdin);

freopen("even.out","w",stdout);

scanf("%d",&n);f=1;

scanf("%d",&tmp);if(tmp%2)***=1;

for(int i=2;i<=n;i++)

else

else

else

printf("%d",f);

return 0;

二.lgtb與序列:

題意:求由給定序列變成互質序列的最小增減數;

分析:a<=30的特性可以分析得出a最多取到58,58以內素數很少所以可以直接狀壓質因子,提取出影響因素;對於選擇很多的情況,直接列舉每個情況要比搜尋還要節約時間(得多),然後會發現還是會超時,這時候,我們的神器——打表就出現啦!對於乙個固定不變的東西,打表是很好的選擇,對於a>b,變成數時肯定a變的數大一點比較優,所以快排;;

程式:#include

#include

#include

#include

#include

using namespace std;

int f[80005][105],map[16]=;

int a[105];

int bit[59]=;

int n;

const int maxn=1<<16;

bool cmp(int x,int y)

if(x>y)return true;

else return false;

int main()

freopen("seq.in","r",stdin);

freopen("seq.out","w",stdout);

scanf("%d",&n);

for(int i=1;i<=n;i++)scanf("%d",&a[i]);sort(a+1,a+n+1,cmp);

memset(f,127,sizeof(f));

for(int i=0;iint mini=min(16,n);

for(int i=1;i<=mini;i++)

for(int j=0;jfor(int k=1;k<=58;k++)

if(bit[k]&j)continue;

if(abs(a[i]-k)+f[j][i-1]int mini2=mini;mini=2e9;

for(int i=1;ifor(int i=17;i<=n;i++)mini+=abs(a[i]-1);

printf("%d",mini);

return 0;

三.lgtb與大數

題意:對乙個字串經行處理,每次把乙個數字替換為乙個數字串,最火輸出這個數字串對1e9+7取mod的結果;

分析:鍊錶實現過了40分,存不下;正解是從後向前推每個數字最後變成了哪個數,這樣可以確定排除這個數代表的數又被改了的問題,是一種操作的逆向化,這道題也要小心紀錄轉換成的數字串的長度可能會超範圍,而長度的唯一作用就是用來快速冪,所以可以直接mod(運用費馬小定理,注意1e9+7是質數!這是一條很重要的性質!(雖然沒有很強的指向性))

程式:#include

#include

#include

#include

using namespace std;

long long ans,m[10][100005],ll[11];

long long len[100010],n;

string tov[100005],tmp;

char fr[100010],a[100005];

const int mod=1000000007;

/*int qpow(int u)

u%=mod-1;int an=10;

if(!u)return 1;u--;

while(u)

for(int i=n;i>=1;i--)for(int k=0;k<=9;k++)if(k==fr[i]-'0'){             

long long tot=0;

for(int j=0;jint ns=tov[i][j]-'0';

m[k][i]*=qpow(ll[tov[i][j]-'0']);m[k][i]%=mod;

m[k][i]+=m[tov[i][j]-'0'][i+1];m[k][i]%=mod;

tot+=ll[tov[i][j]-'0'];tot%=mod-1;

ll[k]=tot;if(!ll[k])ll[k]=mod-1;

else{

m[k][i]=m[k][i+1];

long long l=strlen(a);

for(int i=0;ians*=qpow(ll[a[i]-'0']);ans%=mod;

ans+=m[a[i]-'0'][1]; ans%=mod;

printf("%i64d",ans%mod);

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 地 址...