然而只有一道動態規劃的題目。。。
其他三道題都是模擬。。。
難度還是有所增加的。至少在洛谷中又有一道藍題了。
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求出最大流。每個工件要...