diff --git a/Template/main.cpp b/Template/main.cpp index 988cea6..ca1fc30 100644 --- a/Template/main.cpp +++ b/Template/main.cpp @@ -1,4 +1,3 @@ -#include #include using namespace std; int main() diff --git a/ll1882_chopsticks/Readme.md b/ll1882_chopsticks/Readme.md new file mode 100644 index 0000000..b4f8d75 --- /dev/null +++ b/ll1882_chopsticks/Readme.md @@ -0,0 +1,3 @@ +# 标题 + +* 内容 \ No newline at end of file diff --git a/ll1882_chopsticks/doc/Readme.md b/ll1882_chopsticks/doc/Readme.md new file mode 100644 index 0000000..1dff5a7 --- /dev/null +++ b/ll1882_chopsticks/doc/Readme.md @@ -0,0 +1,21 @@ +# 【ybt动态规划】筷子 + + + +【问题描述】 +A先生有很多双筷子。确切的说应该是很多根,因为筷子的长度不一,很难判断出哪两根是一双的。这天,A先生家里来了K个客人,A先生留下他们吃晚饭。加上A先生,A夫人和他们的孩子小A,共K+3个人。每人需要用一双筷子。A先生只好清理了一下筷子,共N根,长度为T1,T2,T3,……,TN.现在他想用这些筷子组合成K+3双,使每双的筷子长度差的平方和最小。(怎么不是和最小??这要去问A先生了,呵呵) +【输入格式】 +输入文件共有两行,第一行为两个用空格隔开的整数,表示N,K(1≤ N ≤100, 0< K<50),第二行共有N个用空格隔开的整数,为Ti.每个整数为1~50之间的数。 +【输出格式】 +输出文件仅一行。如果凑不齐K+3双,输出-1,否则输出长度差平方和的最小值。 +【输入样例】 +10 1 +1 1 2 3 3 3 4 6 10 20 +【输出样例】 +5 +说明: +第一双 1 1 +第二双 2 3 +第三双 3 3 +第四双 4 6 +(1-1)^2+(2-3)^2+(3-3)^2+(4-6)^2=5 \ No newline at end of file diff --git a/ll1882_chopsticks/main.cpp b/ll1882_chopsticks/main.cpp new file mode 100644 index 0000000..19ff775 --- /dev/null +++ b/ll1882_chopsticks/main.cpp @@ -0,0 +1,34 @@ +#include +#include +using namespace std; +int main(){ + int kuaiz,ke,ren=3,a[101]; + cin>>kuaiz>>ke; + for(int i=1;i<=kuaiz;i++){ + cin>>a[i];; + } + ren+=ke; + if(ren*2>kuaiz){ + cout<<"-1"; + return 0; + } + sort(a+1,a+kuaiz+1); + int f[101][51]={0}; + bool pan[101][51]={0}; + for(int i=2;i<=kuaiz;i++){ + for(int j=1;j<=ren;j++){ + if(f[i-1][j]==0&&pan[i-1][j]==0){ + f[i][j]=f[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]); + pan[i][j]=1; + }else{ + f[i][j]= min (f[i-1][j],f[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1])); + pan[i][j]=1; + } + //cout<