USACO2 2 解題報告

2022-09-03 04:15:10 字數 4518 閱讀 2876

然而只有一道動態規劃的題目。。。

其他三道題都是模擬。。。

難度還是有所增加的。至少在洛谷中又有一道藍題了。

usaco:

思路:我們會發現羅馬數字中每一位都是獨立的。不會遭到其他位的干擾。

例如數字319731

97和113211

32和710871

08,他們的百位都是1

1,但是其他位沒有一樣的,但是百位的表示還都是不變的。

那麼就一位一位地處理,從高位到低位乙個乙個輸出即可。

**:

#include

#include

using

namespace std;

const

char ch[8]

=;const

int num[8]

=;int n,ans[8]

;void

work

(int x,

int i)

intmain()

}for

(int i=

1;i<=

8;i++)if

(ans[i]

) cout<

<<

' '<

<

return0;

}

思路:

很明顯的dpd

p啊。題目可以等價的轉換為求在1∼n

1∼n中選出幾個數使得和為1+2

+3+.

..+n

221+

2+3+

...+

n​的方案數。

很明顯可以設f[i

][j]

f[i]

[j]表示選完i

i個數,和為j

j的方案數。那麼就有f[

i][j

]+=f

[i−1

][j−

i]f[

i][j

]+=f

[i−1

][j−

i]那麼答案就是f[n

][1+

2+3+

...+

n2]=

f[n]

[n(1

+n)2

2]=f

[n][

n(1+

n)4]

f[n]

[21+

2+3+

...+

n​]=

f[n]

[22n

(1+n

)​​]

=f[n

][4n

(1+n

)​]那麼如果n(1

+n)n

(1+n

)不是4

4的倍數就輸出0

0好了。

優化:可以利用揹包的思想將第一位省略掉。

**:

#include

#define ll long long

using

namespace std;

int n,m;

ll f[

1300];

intmain()

思路:

直接暴力模擬,每乙個數判斷一下即可。

毫無難度。注意細節。

**:

#include

#include

#include

using

namespace std;

int m,n,len,a[30]

;bool vis[30]

,ok;

bool

check()

return1;

}int

main()

for(

int i=

1;i<=len/

2;i++

)swap

(a[i]

,a[len-i+1]

);}while(!

check()

);for(

int i=

1;i<=len;i++

)printf

("%d"

,a[i]);

printf

("\n");

return0;

}

思路:

我們來看一下四種轉化方法的迴圈結。

改變所有的數,迴圈結11。

兩個數中改變乙個,迴圈結22。

同上,迴圈結22。

三個數中改乙個,迴圈結33。

lcm(

1,2,

2,3)

=6lc

m(1,

2,2,

3)=6

所以最終答案一定是每6個數為乙個迴圈結

那麼我們就只要維護這個數列的前6

6個數就可以了!

繼續優化。

我們知道,任意一種改變方式按奇數次和偶數次是相同的,即你按7

7次,10110

1次,79813256579

8132

565次,2x+

12x+

1次都是一樣的,而你按6

6次,19819

8次,35435775235

4357

752次,2x2

x次都是一樣的。

那麼我們就對於每一種按鈕列舉0∼1

0∼1,表示按偶數下還是奇數下。那麼如果滿足:

所有的按鈕按下後的奇偶性和總按下次數相同。

列舉的迴圈變數相加不大於總按下次數。

那麼就可以進行模擬,求出最終燈(的前六位),如果符合要求,就儲存這個答案,最終排序輸出即可。

時間複雜度:o(1

)o(1

)(常數24×

624×

6)。(或者說o(2

4×6)

o(24

×6))

#include

#include

using

namespace std;

int n,m,x,sum;

bool o[7]

,c[7];

struct answer

ans[30]

;bool

cmp(answer x,answer y)

//從小到大排序

bool

check

(int i,

int j,

int k,

int l)

void

work

(int i,

int j,

int k,

int l);if

(i)for

(int q=

1;q<=

6;q++

) a[q]^=

1;if(j)

for(

int q=

1;q<=

6;q+=2

) a[q]^=

1;if(k)

for(

int q=

2;q<=

6;q+=2

) a[q]^=

1;if(l)

for(

int q=

1;q<=

6;q+=3

) a[q]^=

1;for(

int q=

1;q<=

6;q++)if

((o[q]&&(

!a[q]))

||(c[q]

&&a[q]))

return

;//判斷是否符合要求

sum++

;for

(int q=

1;q<=

6;q++

) ans[sum]

.num[q]

=a[q]

;//記錄答案

}int

main()

while(1

)for

(int i=

0;i<=

1;i++

)for

(int j=

0;j<=

1;j++

)for

(int k=

0;k<=

1;k++

)for

(int l=

0;l<=

1;l++)if

(check

(i,j,k,l)

)work

(i,j,k,l)

;sort

(ans+

1,ans+

1+sum,cmp)

;for

(int i=

1;i<=sum;i++)if

(!sum)

puts

("impossible");

return0;

}

USACO 2 2 序言頁碼 MATH

description 一類書的序言是以羅馬數字標頁碼的。傳統羅馬數字用單個字母表示特定的數值,一下是標準數字表 i 1 l 50 m 1000 v 5 c 100 x 10 d 500 最多3個可以表示為10n的數字 i,x,c,m 可以連續放在一起,表示它們的和 iii 3 ccc 300 可表...

解題報告 USACO 酸奶工廠

奶牛經營了一家酸奶工廠,生意非常紅火。在接下去的 n 個月裡,第 i 個月需要向社會提供 a i 噸酸奶。酸奶的生產受到很多因素的影響,所以每個月的生產成本是變化的,其中第 i 個月的成本是 每噸 c i 元。奶牛可以提前裡把酸奶做好,存在倉庫裡,等需要的時候再拿出來賣。儲存在倉庫裡的酸奶,每 噸酸...

USACO 4 2解題報告

求最大流。模板題,dinic即可。給出每個奶牛所喜愛的牛棚,每個奶牛只在它喜愛的牛棚中才能產奶,每個牛棚最大容納乙隻奶牛,求最多能讓多少奶牛產奶。最大流問題,源點向每頭奶牛連一條容量為1的邊,每頭奶牛向它喜愛的牛棚連一條容量為1的邊,每個牛棚向匯點連一條容量為1的邊,dinic求出最大流。每個工件要...