1、$A_{1}=2,A_{2}=3,A_{n}=A_{n-2}+A_{n-1}-1$。给出数字$n$,将其表示成若干个$A$中的不同元素的和。

思路:设$B_{n}=A_{n}-1$,那么有$B_{n}=B_{n-2}+B_{n-1},B_{1}=1,B_{2}=2$。那么$B$其实是斐波那契数列。设将$n$表示成$k$个$A$中的元素,那么就等同于将$n-k$表示成$k$个$B$中不同的元素。这个分两步进行:(1)将$n-k$表示成最少的$B$中元素的和,(2)如果这个个数大于$k$那么无解。若小于$k$,可以将某个数字$x=B_{t}$替换为$B_{t-2}+B_{t-1}$以增加一个数字。

#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <stack>
using namespace std; long long f[100];
int n; void init(long long x)
{
f[1]=1;
f[2]=2;
for(int i=3;i<100;++i)
{
f[i]=f[i-1]+f[i-2];
if(f[i]>x)
{
n=i-1; break;
}
}
} vector<int> ans; int check(int k,long long x)
{
if(x<=0) return 0;
ans.clear();
while(x>0)
{
for(int i=n;i>=1;--i) if(x>=f[i])
{
ans.push_back(i);
x-=f[i];
break;
}
}
if((int)ans.size()>k) return 0;
while((int)ans.size()<k)
{
sort(ans.begin(),ans.end());
int ok=0;
for(int i=0;i<(int)ans.size();++i)
{
if((i==0&&ans[0]>=3)||(i!=0&&ans[i]-ans[i-1]>=3))
{
ans.push_back(ans[i]-1);
ans[i]-=2;
ok=1;
break;
}
}
if(!ok) return 0;
}
return 1;
} class AlmostFibonacciKnapsack
{
public:
vector<int> getIndices(long long x)
{
init(x);
for(int i=1;i<=n;++i) if(check(i,x-i)) return ans;
return vector<int>{-1};
}
};

 2、给出一个二维整数数组$A[n][n]$。构造一个$n$个顶点的带权无向图$G$,使得对于$G$中任意两点$i,j$,它们之间的最小割等于$A[i][j]$。

思路:最小割的一个性质是:对于由一个割$C$将$G$分成的两个点集$P,Q$,对于$P,Q$内任意一点$p,q$,它们之间的最小割小于等于$|C|$。所以,初始化所有顶点是一个集合$S$。然后每一步重复下面操作:

(1)若$S$的大小小于2结束;否则找到最小的$t=A[i][j],i\in S,j\in S$

(2)初始化集合$S_{0},S_{1}$为空,将$S$中第一个元素$x_{0}$放入$S_{0}$.然后对于$S$中任意一个其他元素$x_{i}$,若$A[x_{0}][x_{i}]>t$则将$x_{i}$放入$S_{0}$,否则将其放入$S_{1}$

(3)对于$S_{0},S_{1}$中的元素$x,y$,若$A[x][y]!=t$,则无解。

(4)递归判断$S_{0},S_{1}$

#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <stack>
using namespace std; const int N=2005;
const int INF=1000000005; class AllGraphCuts
{
int n;
int g[55][55];
vector<int> ans; void add(int u,int v,int w)
{
ans.push_back(w*n*n+u*n+v);
} int dfs(vector<int> S)
{
if(S.size()<=1) return 1;
int tmp=INF;
for(int i=0;i<(int)S.size();++i) for(int j=0;j<(int)S.size();++j)
{
if(i!=j&&g[S[i]][S[j]]<tmp) tmp=g[S[i]][S[j]];
}
vector<int> S0,S1;
S0.push_back(S[0]);
for(int i=1;i<(int)S.size();++i)
{
if(g[S[0]][S[i]]>tmp) S0.push_back(S[i]);
else S1.push_back(S[i]);
}
if(S0.empty()||S1.empty()) return 0;
for(int i=0;i<(int)S0.size();++i) for(int j=0;j<(int)S1.size();++j)
{
if(g[S0[i]][S1[j]]!=tmp) return 0;
}
add(S0[0],S1[0],tmp);
return dfs(S0)&&dfs(S1);
} public:
vector<int> findGraph(vector<int> x)
{
n=1;
while(n*n!=(int)x.size()) ++n;
for(int i=0;i<n;++i) for(int j=0;j<n;++j) g[i][j]=x[i*n+j];
for(int i=0;i<n;++i) for(int j=0;j<n;++j)
{
if((i==j&&g[i][j]!=0)||(g[i][j]!=g[j][i])) return vector<int>{-1};
}
vector<int> S;
for(int i=0;i<n;++i) S.push_back(i);
if(dfs(S)) return ans;
return vector<int>{-1};
}
};

  

topcoder srm 687 div1的更多相关文章

  1. Topcoder SRM 643 Div1 250<peter_pan>

    Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...

  2. Topcoder Srm 726 Div1 Hard

    Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...

  3. topcoder srm 714 div1

    problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...

  4. topcoder srm 738 div1 FindThePerfectTriangle(枚举)

    Problem Statement      You are given the ints perimeter and area. Your task is to find a triangle wi ...

  5. Topcoder SRM 602 div1题解

    打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...

  6. Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串

    Problem Statement      The Happy Letter game is played as follows: At the beginning, several players ...

  7. Topcoder SRM 584 DIV1 600

    思路太繁琐了 ,实在不想解释了 代码: #include<iostream> #include<cstdio> #include<string> #include& ...

  8. TopCoder SRM 605 DIV1

    604的题解还没有写出来呢.先上605的. 代码去practice房间找. 说思路. A: 贪心,对于每个类型的正值求和,如果没有正值就取最大值,按着求出的值排序,枚举选多少个类型. B: 很明显是d ...

  9. topcoder srm 575 div1

    problem1 link 如果$k$是先手必胜那么$f(k)=1$否则$f(k)=0$ 通过对前面小的数字的计算可以发现:(1)$f(2k+1)=0$,(2)$f(2^{2k+1})=0$,(3)其 ...

随机推荐

  1. 一个tomcat下,两个系统的jar包可以相互引用。

    将道路挖占管理系统(rems)从交通设备设施系统(tms)中剥离出去以后,在本地调试的时候是在同一个Tomcat下启动的,上传文件成功. 然后部署到西安以后,分成两个tomcat以后,发现rems上传 ...

  2. js的基本包装类型

    基本包装类型(包装对象): 先看下以下代码: var s1 = "helloworld"; var s2 = s1.substr(4); 上面我们说到字符串是基本数据类型,不应该有 ...

  3. RSA加解密 公钥加密私钥解密 公加私解 && C++ 调用openssl库 的代码实例

    前提:秘钥长度=1024 ============================================== 对一片(117字节)明文加密 ========================= ...

  4. js字符串三个编码的区别

    1.escape():编码目的为了防止字符串中特殊字符造成运算错误,主要在字符串运算中使用: 不进行编码的69个字符:A-Z.a-z.0-9.@.*._.+.-...\. 2.encodeURI(): ...

  5. CentOS中利用Docker安装RabbitMQ

    CentOS中利用Docker安装RabbitMQ 1.拉取镜像(带管理平台) #docker pull rabbitmq:3.7.7-management 2.启动容器: #docker run - ...

  6. 将n的k位s置1

    实例四:将n的k位s置1 方法:result =n|(1<<k) 只使k位变为1,其他位为0,再进行或操作,1与任何数的或操作都是1. 解释: 原数 0000 1011 ---11 数值1 ...

  7. Marlin 擠出頭溫度控制PID值校正

    Marlin 擠出頭溫度控制PID值校正 擠出頭加熱器.溫度感應器安裝好後,先別急著直接指定工作溫度並且加熱.因為控制板上的溫度控制PID參數尚未校正.如果加熱速度過快,有可能會加熱過度並且導致零件燒 ...

  8. Sitecore 9有什么新功能

    在这个新版本中有很多值得爱的东西.每个人都会有自己喜欢的新功能,但是,我想与你分享一些地雷: xConnect 正如我们在Sitecore的官方Sitecore 9新闻稿中所见的那样,“新的xConn ...

  9. uva 11354 Bond

    题意: 邦德在逃命!他在一个有N个城市,由M条边连接的道路网中.一条路的危险度被定义为这条路上危险度最大的边的危险度. 现在给出若干个询问,s,t,问从s到t的最小的危险度是多少. 思路: 首先可以证 ...

  10. JVM探秘3---垃圾回收机制详解

    众所周知,Java有自己的垃圾回收机制,它可以有效的释放系统资源,提高系统的运行效率.那么它是怎么运行的呢,这次就来详细解析下Java的垃圾回收 1.什么是垃圾? 垃圾回收回收的自然是垃圾,那么jav ...