POJ-3590 The shuffle Problem 置换+DP | DFS

  题目链接:http://poj.org/problem?id=3590

  自己暴力给水过去了,不过效率有点低。题目要求的就是给一个数n,要你求出一种方案,一些和为n的数的最小公倍数最大。题目数据量不大,容易想到用暴力的办法求出所用情况,然后比较就可以了,然后再剪下枝就可以过了。不过有更好的方法。和为n的数的最大公倍数可以用DP求出来:f[i][j]表示和为i的数划分为j个循环节时的最大公倍数,则f[i][j]=max{f[i-k][j-1] | j-1<=k<i-1};然后就是求最小的置换了。设n的最大公倍数是m,则有p1^k1*p2^k2*……*pn^kn=m,显然有p1^k1+p2^k2+……+pn^kn<=n,所以p1^k1,p2^k2,……,pn^kn就是每个循环的长度,然后贪心排一下就可以了,注意如果还有剩余,则按循环长度1计算。

 置换+DP:

 1 //STATUS:C++_AC_32MS_236KB
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 #include<string.h>
 5 #include<math.h>
 6 #include<iostream>
 7 #include<string>
 8 #include<algorithm>
 9 #include<vector>
10 #include<queue>
11 #include<stack>
12 using namespace std;
13 #define LL __int64
14 #define pdi pair<int,int>
15 #define Max(a,b) ((a)>(b)?(a):(b))
16 #define Min(a,b) ((a)<(b)?(a):(b))
17 #define mem(a,b) memset(a,b,sizeof(a))
18 #define lson l,mid,rt<<1
19 #define rson mid+1,r,rt<<1|1
20 const int N=110,INF=0x3f3f3f3f,MOD=100000000;
21 const double DNF=100000000000;
22 
23 int f[N][N],list[N][N],one[N];
24 int n,k,T;
25 
26 int gcd(int a,int b)
27 {
28     return b?gcd(b,a%b):a;
29 }
30 
31 void getans(int a)
32 {
33     int i,k=0,cou,sum=n;
34     for(i=2;i<=a;i++){
35         if(a%i==0){
36             list[n][++k]=1;
37             while(a%i==0){
38                 list[n][k]*=i;
39                 a/=i;
40             }
41             sum-=list[n][k];
42         }
43     }
44     if(a>1)sum-=list[n][++k]=a;
45     sort(list[n],list[n]+k+1);
46     list[n][0]=k;
47     one[n]=sum;
48 }
49 
50 int main()
51 {
52  //   freopen("in.txt","r",stdin);
53     int i,j,t;
54     f[1][0]=f[1][1]=1;
55     for(i=2;i<=100;i++){
56         f[i][0]=f[i][1]=i;
57         for(j=2;j<=i;j++){
58             for(k=i-1;k>=j-1;k--)
59                 f[i][j]=Max(f[i][j],f[k][j-1]/gcd(f[k][j-1],i-k)*(i-k));
60             f[i][0]=Max(f[i][0],f[i][j]);
61         }
62     }
63     scanf("%d",&T);
64     while(T--)
65     {
66         scanf("%d",&n);
67         if(!list[n][0])getans(f[n][0]);
68         printf("%d",f[n][0]);
69         for(i=1;i<=one[n];i++)
70             printf(" %d",i);
71         t=one[n]+1;
72         for(i=1;i<=list[n][0];i++){
73             for(j=1;j<list[n][i];j++)
74                 printf(" %d",j+t);
75             printf(" %d",t);
76             t+=list[n][i];
77         }
78         putchar('\n');
79     }
80     return 0;
81 }

 

DFS:

 1 //STATUS:C++_AC_954MS_192KB
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 #include<string.h>
 5 #include<math.h>
 6 #include<iostream>
 7 #include<string>
 8 #include<algorithm>
 9 #include<vector>
10 #include<queue>
11 #include<stack>
12 using namespace std;
13 #define LL __int64
14 #define pdi pair<int,int>
15 #define Max(a,b) ((a)>(b)?(a):(b))
16 #define Min(a,b) ((a)<(b)?(a):(b))
17 #define mem(a,b) memset(a,b,sizeof(a))
18 #define lson l,mid,rt<<1
19 #define rson mid+1,r,rt<<1|1
20 const int N=110,INF=0x3f3f3f3f,MOD=100000000;
21 const double DNF=100000000000;
22 
23 int A[N],list[N][N],ans[N],one[N];
24 int n,k,T;
25 
26 int gcd(int a,int b)
27 {
28     return b?gcd(b,a%b):a;
29 }
30 
31 void dfs(int cur,int val,int la)
32 {
33     if(val<=la){
34         int j,t=A[1],sum=n-A[1];
35         if(A[1]==1)sum++;
36         for(j=2;j<cur;j++){
37             sum-=A[j];
38             t=t/gcd(t,A[j])*A[j];
39         }
40         if( t>ans[n] || (t==ans[n] && sum>one[n]) ){
41             ans[n]=t;
42             for(j=1;j<cur;j++)list[n][j]=A[j];
43             list[n][0]=cur-1;
44             one[n]=sum;
45         }
46         return;
47     }
48     int i;
49     for(i=la+1;i<=val && i<=23;i++){
50         A[cur]=i;
51         dfs(cur+1,val-i,i);
52     }
53 }
54 
55 int main()
56 {
57  //   freopen("in.txt","r",stdin);
58     int i,j,t;
59     scanf("%d",&T);
60     while(T--)
61     {
62         scanf("%d",&n);
63         if(!list[n][0])dfs(1,n,0);
64         printf("%d",ans[n]);
65         if(one[n]){
66             t=one[n]+1;
67             for(i=1;i<=one[n];i++)printf(" %d",i);
68         }
69         else t=1;
70         for(i=1;i<=list[n][0];i++){
71             if(list[n][i]==1)continue;
72             for(j=1;j<list[n][i];j++)
73                 printf(" %d",t+j);
74             printf(" %d",t);
75             t+=list[n][i];
76         }
77         putchar('\n');
78     }
79     return 0;
80 }

 

转载于:https://www.cnblogs.com/zhsl/archive/2013/03/04/2943512.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/474649.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode MySQL 1454. 活跃用户(连续dense_rank排名函数)

文章目录1. 题目2. 解题1. 题目 表 Accounts: ------------------------ | Column Name | Type | ------------------------ | id | int | | name | varchar | ------------------------ id 是该表主键. 该表包含账户 id 和账户的用户名.表 Log…

Java随机生成长宽的矩形_java – 将正方形或矩形分解为大量随机大小的正方形或矩形...

提供的代码创建一个k-d tree.您可以使用它在矩形上绘制线条,将其划分为更小的矩形.获得树后,可以按如下方式使用它将区域划分为这些矩形&#xff1a;>在树的根部选择节点.>通过这一点绘制一条垂直线.>选择它的左子,在你刚刚通过它的父线绘制的线左侧的这一点画一条水平…

java自动加空格吗_程序加上空格和不加空格运行结果不一样

已结贴√问题点数&#xff1a;20 回复次数&#xff1a;2程序加上空格和不加空格运行结果不一样程序第六行在教育教学后面加空格结果为全部图书&#xff1a;1.郁达夫随笔&#xff1a;伤感行旅 郁达夫 北京大学出版社 38.02.教育教学 李晓燕 高等教育出…

LeetCode MySQL 585. 2016年的投资(窗口函数over(partition by xx))

文章目录1. 题目2. 解题1. 题目 写一个查询语句&#xff0c;将 2016 年 (TIV_2016) 所有成功投资的金额加起来&#xff0c;保留 2 位小数。 对于一个投保人&#xff0c;他在 2016 年成功投资的条件是&#xff1a; 他在 2015 年的投保额 (TIV_2015) 至少跟一个其他投保人在 2…

黑马程序员---面向对象笔记总结

------- android培训、java培训、期待与您交流&#xff01; ---------- 封装 匿名函数 2--匿名对象使用方式一&#xff0c;当对象的方法只调用一次时&#xff0c;可以用匿名对象完成&#xff0c;这样写比较简单&#xff0c;如果对一个对象进行多个成员必须个这个对象起个名字…

mysql 选择特定的表_MySQL选择具有多个特定列的所有表

我想获取具有3个特定列的所有表名.我想要的是从信息模式中获取所有包含columnA AND columnB AND columnC的表名.目前,我正在使用类似的查询SELECT DISTINCT TABLE_NAMEFROM INFORMATION_SCHEMA.COLUMNSWHERE COLUMN_NAMEcolumnAAND TABLE_SCHEMAmysampledatabase;如何扩展上述查…

LeetCode MySQL 1321. 餐馆营业额变化增长(over窗口函数)

文章目录1. 题目2. 解题1. 题目 表: Customer ------------------------ | Column Name | Type | ------------------------ | customer_id | int | | name | varchar | | visited_on | date | | amount | int | ---------------------…

HTML DOM content 属性

摘自&#xff1a;http://www.w3school.com.cn/htmldom/prop_style_content.asp 定义和用法 content 属性设置文本或图像出现&#xff08;浮动&#xff09;在另一个元素中的什么地方。 语法&#xff1a; Object.style.contentvalue 可能的值 值描述string定义文本内容。url定义 …

java requestbody map_java-如何将Map转换为RequestBody?

使用Retrofit 2.4.0,我正在发出Multipart POST请求.我正在将文件作为Part以及一些元数据作为PartMap发送.这就是通话的样子.MultipartPOST("https://8hoot.com/my-path")Single> uploadMedia(PartMap Map metadata,Part MultipartBody.Part filePart);还有另一个M…

LeetCode MySQL 1398. 购买了产品A和产品B却没有购买产品C的顾客

文章目录1. 题目2. 解题1. 题目 Customers 表&#xff1a; ------------------------------ | Column Name | Type | ------------------------------ | customer_id | int | | customer_name | varchar | ------------------------------ cust…

Java 网络编程(二) 两类传输协议:TCP UDP

两类传输协议&#xff1a;TCP,UDP TCP TCP是Transfer Control Protocol&#xff08;传输控制协议&#xff09;的简称&#xff0c;是一种面向连接的保证可靠传输的协议。 在TCP/IP协议中&#xff0c; IP层主要负责网络主机的定位&#xff0c;数据传输的路由&#xff0c;由IP地址…

Java求最小数用哪个函数_在Java中使用小数进行计算的函数

例如,当您键入22和56时,此代码可以正常工作,它显示正确的结果import java.util.Scanner;class apples{public static void main(String args[]){Scanner villy new Scanner (System.in);double fnum, snum, answer;System.out.println("Enter first num: ");fnum v…

LeetCode MySQL 1285. 找到连续区间的开始和结束数字(dense_rank连续排名)

文章目录1. 题目2. 解题1. 题目 表&#xff1a;Logs ------------------------ | Column Name | Type | ------------------------ | log_id | int | ------------------------ id 是上表的主键。 上表的每一行包含日志表中的一个 ID。后来一些 ID 从 Logs 表…

java自定义标签简单_JSP 自定义标签之一 简单实例

在jsp中使用自定义标签可以达到这样的目的&#xff0c;事实上&#xff0c;我们所熟知的各类框架基本上都是通过自定义标签的形式来实现的。通过使用自定义标签&#xff0c;我们可以将实现复杂的逻辑在页面用简单的标签来加以展示。下面我们来实现一个非常简单的自定义标签&…

case study

To be continue...转载于:https://www.cnblogs.com/zhangzhang/archive/2013/03/10/2953199.html

LeetCode MySQL 1440. 计算布尔表达式的值(case when then else end)

文章目录1. 题目2. 解题1. 题目 表 Variables: ------------------------ | Column Name | Type | ------------------------ | name | varchar | | value | int | ------------------------ name 是该表主键. 该表包含了存储的变量及其对应的值.表…

phpstud如何安装mysql新版_phpstudy 升级mysql版本

phpstudy里没有地方可以设置mysql数据库&#xff0c;很多人都疑惑在phpstudy里怎么升级mysql数据库版本&#xff0c;本文就教你如何在phpstudy中升级mysql的版本。phpstudy集成环境中的mysql数据库的版本默认是mysql5.5&#xff0c;下面是phpstudy升级数据库到mysql5.7的方法&a…

AjaxControlToolkit AjaxFileUpload 为英文的解决办法

下载AjaxControlToolkit的源代码 在ajaxcontroltoolkit-a2a6dc6854e0\Client\MicrosoftAjax.Extended\ExtenderBase\BaseScriptsResources.zh-CHS.resx里按照例子 如下修改 <data name"AjaxFileUpload_SelectFile" xml:space"preserve"> <val…

LeetCode MySQL 1341. 电影评分

文章目录1. 题目2. 解题1. 题目 表&#xff1a;Movies ------------------------ | Column Name | Type | ------------------------ | movie_id | int | | title | varchar | ------------------------ movie_id 是这个表的主键。 title 是电影的名字…

Linux shell脚本 遍历带空格的文件名

一般的写法是 for f in ls ./ 但是如果文件名中带空格&#xff0c;比如"A B" 那么虽然ls能正确列出&#xff0c;但是for却会把空格当成分隔符 将A&#xff0c;B分别赋给f&#xff0c;导致变成两个文件名 研究发现问号&#xff1f;在文件名中也可以代表空格。因此可以…