1、问题描述:

悠悠假期同叔叔一起去书店,他选中了六本书,每本书的单价(单位:元)分别为:3.1,1.7,2,5.3,
0.9 和7.2。不巧的是,叔叔只带了十几块钱,为了让悠悠高兴,叔叔同意买书,但提出了一个要求,要悠
悠从六本书中选出若干本,使得单价相加所得的和同10 最接近。请编程帮助悠悠解决这个问题。输出格
式:第一行输出1 个整数,表示组合方法数量;第二行开始,一行输出一种价格组合。

#include"cstdio"
#include"cmath"
#include"vector"
using namespace std;
double p[]={3.1,1.7,,5.3,0.9,7.2};
int a[];
vector<double> vec[<<];
double maxn;
int cnt;
void solve()
{
for(a[]=;a[]<=;a[]++)
for(a[]=;a[]<=;a[]++)
for(a[]=;a[]<=;a[]++)
for(a[]=;a[]<=;a[]++)
for(a[]=;a[]<=;a[]++)
for(a[]=;a[]<=;a[]++)
{
double s=;
for(int j=;j<;j++)
{
s+=a[j]*p[j];
}
if(fabs(s-)<maxn)
{
maxn=fabs(s-);
for(int i=;i<cnt;i++)
{
vec[i].clear();//若最小值更新,则将结果清空
}
cnt=;
}
if(fabs(fabs(s-)-maxn)<0.000001)
{
for(int j=;j<;j++)
{
if(a[j]!=) vec[cnt].push_back(p[j]);
}
cnt++;
} }
}
void print()
{
printf("%d\n",cnt);
for(int i=;i<cnt;i++)
{
for(int j=;j<vec[i].size();j++)
{
printf("%lf ",vec[i][j]);
}
printf("\n");
}
}
int main()
{
maxn=;
solve();
print();
return ;
}

2、问题描述:

将1、2、3、4、5 和6 填入下表中,要使得每一列右边的数字比左边的数字大,每一行下面的数字比
上面的数字大。请编程计算共有几种填写方法?输出:第一行输出1 个整数,表示填写方法数量;第二行,
依次输出每种填写方式。

#include"cstdio"
#include"set"
#include"vector"
using namespace std;
int a[]={,,,,,};
set<int> vec;
vector<int> ss[**];
int cnt;
bool check()
{
for(int i=;i<;i++)
{
if(!(a[i+]>a[i]&&a[i++]>a[i+]&&a[i+]>a[i]))
{
return false;
}
}
if(!(a[]>a[]))
{
return false;
}
return true;
}
void solve()
{
for(a[]=;a[]<=;a[]++)
for(a[]=;a[]<=;a[]++)
for(a[]=;a[]<=;a[]++)
for(a[]=;a[]<=;a[]++)
for(a[]=;a[]<=;a[]++)
for(a[]=;a[]<=;a[]++)
{
vec.clear();
for(int j=;j<;j++)
{
vec.insert(a[j]);
}
if(vec.size()==&&check())
{
for(int j=;j<;j++)
{
ss[cnt].push_back(a[j]);
}
cnt++;
}
}
}
void print()
{
printf("%d\n",cnt);
for(int i=;i<cnt;i++)
{
for(int j=;j<;j++)
{
printf("%d ",ss[i][j]);
if(j==) printf("\n");
}
printf("\n\n");
}
}
int main()
{
solve();
print();
return ;
}

3、问题描述:

在一个旅馆中住着六个不同国籍的人,他们分别来自美国(US)、德国(GER)、英国(UK)、法国
(FRA)、俄罗斯(RUS)和意大利(ITA)。他们的名字叫A、B、C、D、E 和F。名字的顺序与上面的
国籍不一定是相互对应的。现在已知:
1)A 和美国人是医生。 2)E 和俄罗斯人是技师。
3)C 和德国人是技师。 4)B 和F 曾经当过兵,而德国人从未参过军。
5)法国人比A 年龄大;意大利人比C 年龄大。
6)B 同美国人下周要去西安旅行,而C 同法国人下周要去杭州度假。
请编程分析出A、B、C、D、E 和F 各是哪国人?(程序必须算法分析过程,不可直接输出结果)
输出格式:第一行输出A 是哪国人,第二行输出B 是哪国人......以此类推。(例如:A is US)

方法一、全排列搜索

#include"algorithm"
#include"vector"
#include"string"
#include"iostream"
using namespace std;
int a[]={,,,,,};
vector<string> ss;
bool check1()
{
if(a[]!=&&a[]!=&&a[]!=&&a[]!=)
{
return true;
}
return false;
}
bool check2()
{
if(a[]==)
{
return true;
}
return false;
}
bool check3()
{
if(a[]!=&&a[]!=&&a[]!=)
{
return true;
}
return false;
}
bool check4()
{
if(a[]!=&&a[]!=&&a[]!=)
{
return true;
}
return false;
}
bool check5()
{
if(a[]!=)
{
return true;
}
return false;
}
void print()
{
for(int i=;i<;i++)
{
string s="";
switch(i)
{
case :{ s+=('A'+a[i]);s+=" is US";break;}
case :{ s+=('A'+a[i]);s+=" is GER";break;}
case :{ s+=('A'+a[i]);s+=" is UK";break;}
case :{ s+=('A'+a[i]);s+=" is FRA";break;}
case :{ s+=('A'+a[i]);s+=" is RUS";break;}
case :{ s+=('A'+a[i]);s+=" is ITA";break;}
}
ss.push_back(s);
}
sort(ss.begin(),ss.end());
for(int i=;i<ss.size();i++)
{
cout<<ss[i]<<endl;
}
}
int main()
{
int ans=;
do{
if(check1()&&check2()&&check3()&&check4()&&check5())
{
break;
}
}while(next_permutation(a,a+));
print();
return ;
}

方法二、消元法

#include"cstdio"
using namespace std;
struct node{
int y,x;
node(int cy,int cx):y(cy),x(cx){}
node(){}
};
int a[][]={
,,,,,,
,,,,,,
,,,,,,
,,,,,,
,,,,,,
,,,,,
};
const char* s[]={"US","GER","UR","FRA","RUS","ITA"};
int ans[];
node unique()
{
for(int i=;i<;i++)
{
int cnt=;
int k;
for(int j=;j<;j++)
{
if(a[j][i]==)
{
cnt++;
k=j;
}
}
if(cnt==)
{
node no(k,i);
return no;
}
}
node no(-,-);
return no;
} void update(int row)
{
for(int i=;i<;i++)
{
a[row][i]=;
}
}
bool solve()
{
for(int i=;i<;i++)
{
node no;
no = unique();
if(no.x==-)
{
printf("error\n");
return false;
}
update(no.y);
ans[no.y]=no.x;
}
return true;
}
void print(bool flag)
{
if(flag)
{
for(int i=;i<;i++)
{
printf("%c is %s\n",'A'+i,s[ans[i]]);
}
}
else
{
printf("error\n");
}
}
int main()
{
print(solve());
return ;
}

4、问题描述:

扬扬喜欢滑雪,可是为了获得速度,滑的区域必须向下倾斜,扬扬想知道在一个区域中最长底滑坡。
区域由一个二维数组表示。数组的每个数字代表点的高度。下面是一个例子:
1 3 5 7
23 25 27 9
21 31 29 11
19 17 15 13
一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的
滑坡为31-25-3-1,长度为4。当然31-29-27-...-5-3-1 更长。事实上,这是最长的一条,长度为16。
输入:每组数据的第一行表示区域的行数R 和列数C(1 <= R,C <= 100)。下面是R 行,每行有C 个整数,
代表高度h,0<=h<=10000。
输出:输出最长区域的长度。

#include"cstdio"
#include"algorithm"
using namespace std;
const int MAXN=;
int h[MAXN][MAXN];
int mp[MAXN][MAXN];
int n,m;
int dx[]={,,-,};
int dy[]={,,,-};
int rdfs(int y,int x)
{
if(mp[y][x]) return mp[y][x];
int k=;
for(int i=;i<;i++)
{
int ny=y+dy[i];
int nx=x+dx[i];
if(<=ny&&ny<n&&<=nx&&nx<m&&h[ny][nx]<h[y][x])
{
k=max(rdfs(ny,nx),k);
}
}
return mp[y][x]=k+;
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=;i<n;i++){
for(int j=;j<m;j++) scanf("%d",&h[i][j]);} int ans=;
for(int i=;i<n;i++){
for(int j=;j<m;j++) ans=max(rdfs(i,j),ans);} printf("%d\n",ans); return ;
}

JUST第二界算法设计大赛题解的更多相关文章

  1. 摹客 · Veer 第二届设计大赛邀你来战!

    2018年12月,摹客设计大赛一年一度一归来. 继2017年摹客全国首届原型设计大赛成功举办后,本次大赛是摹客第二届设计大赛.大赛由摹客主办,Veer独家冠名赞助,iSlide和创客贴协办,国内多家知 ...

  2. 算法设计与分析 - 李春葆 - 第二版 - html v2

    1 .1 第 1 章─概论   1.1.1 练习题   1 . 下列关于算法的说法中正确的有( ).   Ⅰ Ⅱ Ⅲ Ⅳ .求解某一类问题的算法是唯一的   .算法必须在有限步操作之后停止   .算法 ...

  3. 算法设计与分析 - 李春葆 - 第二版 - pdf->word v3

    1.1 第1章─概论 练习题 . 下列关于算法的说法中正确的有( ). Ⅰ.求解某一类问题的算法是唯一的 Ⅱ.算法必须在有限步操作之后停止 Ⅲ.算法的每一步操作必须是明确的,不能有歧义或含义模糊 Ⅳ. ...

  4. 不做Next,争做Nest——庆科首届智能硬件创新设计大赛产生决赛12强

      智能硬件,Wi-Fi互联,谁是下一个Nest?邀你共见证! 2014年3月到7月.由上海庆科信息技术有限公司主办的首届 MXCHIP 智能硬件创新设计大赛--"寻找下一个nest&quo ...

  5. Mockplus设计大赛获奖选手专访 | High音:轻松生活,随心嗨音

    "看似低调,实则高调的设计,UI设计是用了功力,主页功能和内容一览无余,方便用户选择,金字黑底,给予用户极好的奢华体验.原来听歌也是一种视觉享受.创新性源于对听歌氛围的把握,大幅的图片,刺激 ...

  6. 最大子段和的DP算法设计及其效率测试

    表情包形象取自番剧<猫咪日常> 那我也整一个 曾几何时,笔者是个对算法这个概念漠不关心的人,由衷地感觉它就是一种和奥数一样华而不实的存在,即便不使用任何算法的思想我一样能写出能跑的程序 直 ...

  7. 『嗨威说』算法设计与分析 - 动态规划思想小结(HDU 4283 You Are the One)

    本文索引目录: 一.动态规划的基本思想 二.数字三角形.最大子段和(PTA)递归方程 三.一道区间动态规划题点拨升华动态规划思想 四.结对编程情况 一.动态规划的基本思想: 1.1 基本概念: 动态规 ...

  8. LeetCode初级算法--设计问题02:最小栈

    LeetCode初级算法--设计问题02:最小栈 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net ...

  9. 算法设计与分析(李春保)练习题答案v1

    1.1第1 章─概论 1.1.1练习题 1.下列关于算法的说法中正确的有(). Ⅰ.求解某一类问题的算法是唯一的 Ⅱ.算法必须在有限步操作之后停止 Ⅲ.算法的每一步操作必须是明确的,不能有歧义或含义模 ...

随机推荐

  1. SNMP 监控方式的配置

    由于某些设备并不能安装 Agent,或者不方便安装 Agent 等因素,将采用 SNMP 方式进行监控 1.Linux 配置 SNMP [root@crazy-acong ~]# yum -y ins ...

  2. PHP中ob系列函数讲解(浏览器缓存技术) (转)

    Output Control 函数可以让你自由控制脚本中数据的输出.它非常地有用,特别是对于:当你想在数据已经输出后,再输出文件头的情况. 输出控制函数不对使用 header() 或 setcooki ...

  3. CentOS 7.0 systemd

    CentOS 7 已经切换到 systemd,系统指令也有所变化.之前用于启动.重启.停止各种服务的service 作为向后兼容的指令还能使用,但是将来可能会消失.同时,chkconfig 也改成了s ...

  4. Shell中的while循环

    while循环的格式   while expression do command command ``` done 1.计数器控制的while循环    主要用于已经准确知道要输入的数据和字符串的数目 ...

  5. mysql设置有外键的主键自增及其他

    有外键的主键设置自增. ; ALTER TABLE `<table>` MODIFY COLUMN `id` ) NOT NULL AUTO_INCREMENT FIRST; 创建数据库, ...

  6. Data Structure Binary Tree: Construct Full Binary Tree from given preorder and postorder traversals

    http://www.geeksforgeeks.org/full-and-complete-binary-tree-from-given-preorder-and-postorder-travers ...

  7. JAVA事件监听机制与实现

    事件监听机制的实现:参考图:事件模型_ActionEvent 为了节省资源,系统无法对某个事件进行实时的监听.故实现的机制是当发生某个事件后,处理代码将被自动运行,类似钩子一般.(回调函数) 事件有许 ...

  8. sdut oj 操作系统实验--SSTF磁盘调度算法【操作系统算法】

    操作系统实验--SSTF磁盘调度算法 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 磁盘调度在多道程序设计的计算机系统中,各个进 ...

  9. STL中流相关的输入输出符和get函数彻底总结:cin、cin.get()、cin.getline()、getline()、gets()等函数的用法

    我的总结: [首先:对于流来说,就把流看成一个中转的仓库,对流进行<<运算或>>运算或者get函数的运算都是指,把“流”中的数据“运送”到“内存变量”中去,还是把内存变量中的数 ...

  10. GIT使用[git remove untracked working file]

    使用GIT进行merge的时候, git merge --no-ff master 如果merge之后出现问题, 想进行回退, 可以使用 git reset --hard HEAD 来回退到最新的版本 ...