技术标签: 算法 递归 c++ 算法竞赛入门经典第二版 C
double dist(double x1, double y1, double x2, double y2)
{
return sqrt((x1 -x2)*(x1 - x2) + (y1- y2)*(y1 - y2));
}
化简得:
#include <stdio.h>
#include <math.h>
typedef struct point { double x; double y; } point;
double dist(point a, point b)
{
return hypot(a.x - b.x, a.y - b.y); //求直角三角形斜边长,此时看起来清爽多了
}
int main()
{
point A, B;
A.x = A.y = 1;B.x = B.y = 2;
printf("%.3f\n", dist(A, B));
return 0;
}
计算组合数:(
#include <stdio.h>
#include <math.h>
long long C(int n, int m){
if(m < n-m) m = n - m;
long long ans = 1;
for(int i = m+1; i <= n; i++) ans *= i;
for(int i = 1; i <= n-m; i++) ans /= i;
return ans;
}
int main()
{
int m,n;
while(scanf("%d%d", &m, &n)!=EOF && n!=0)
printf("%ld\n", C(n, m));
return 0;
}
素数的判断
#include <stdio.h>
#include <math.h>
int is_prime(int n){
if(n <= 1) return 0;
int m = floor(sqrt(double(n) + 0.5)); //进行四舍五入避免了浮点误差
for(int i = 2; i <=m; i++)
if(n % i == 0) return 0;
return 1;
}
int main()
{
int n;
while(scanf("%d", &n) != EOF)
printf("%d\n", is_prime(n));
return 0;
}
void swap(int *a, int *b){
int *t;
*t = *a; *a = *b; *b = *t;
}
#include <iostream>
int sum1(int *a, int n){ //方法一
int ans = 0;
for(int i = 0; i < n; i++)
ans += a[i];
return ans;
}
int sum2(int *begin, int *end){ //方法二
int n = end - begin;
int ans = 0;
for(int i = 0; i < n; i++)
ans += begin[i];
return ans;
}
int sum3(int *begin, int *end){ //方法三
int ans = 0;
for(int *p = begin; p != end; p++)
ans += *p;
return ans;
}
int main(){
int b[5] = {1, 3, 5, 7, 9};
std::cout << sum1(b+1, 4) << '\n' << sum2(b+1, b+5) << '\n' << sum3(b+1, b+5) << std::endl;
return 0;
}
例题4.1 古老的密码(给定两个长度不超过100的字符串A,B,先对第一个字符串A的字母进行重排,再对每个字母进行一一映射,看能否变为字符串B)
#include <cstdio>
#include <cstring>
#include <cstdlib>
int cmp(const void *a, const void *b){ //qsort中当cmp分别返回负数,0和正数时,分别表示a<b,a==b,a>b
return *(int *)a - *(int *)b; //这里的新内容是指向常数的万能指针const void*,可进行强制类型转换,转换为int型指针
}
int main(){
char str1[105], str2[105];
int cnt1[26], cnt2[26];
memset(cnt1, 0, sizeof(cnt1));
memset(cnt2, 0, sizeof(cnt2));
while(scanf("%s%s", str1, str2) !=EOF){
for(int i = 0; i < strlen(str1); i++){
cnt1[str1[i] - 'A']++;
cnt2[str2[i] - 'A']++;
}
qsort(cnt1, 26, sizeof(int), cmp);
qsort(cnt2, 26, sizeof(int), cmp);
int tag = 1;
for(int i = 0; i < 26; i++)
if(cnt1[i] != cnt2[i]) tag = 0;
if(tag) printf("YES\n");
else printf("NO\n");
}
return 0;
}
(gdb) bt
#0 f (n = 0) at factorial.c: 4
#1 0x00401308 in f (n = 1) at factorial.c: 3
#2 0x00401308 in f (n = 2) at factorial.c: 3
#3 0x00401308 in f (n = 3) at factorial.c: 3
#4 0x00401359 in main () at factorial.c: 6
#include <cstdio>
#include <cstring>
char word[105],gue[105];
bool win, lose;
int left, chance, rnd; //rnd表示轮数,当输入-1时结束
void guess(char ch);
int main(){
while(scanf("%d%s%s", &rnd, word, gue) != EOF && rnd != -1){
printf("Round %d\n", rnd);
chance = 7;
left = strlen(word);
win = lose = false;
for(int i = 0; i < strlen(gue); i++){
guess(gue[i]);
if(lose || win) break;
}
if(win) printf("You Win.\n");
else if(lose) printf("You Lose.\n");
else printf("You chickened out.\n");
}
return 0;
}
void guess(char ch){
int bad = 1;
for(int i = 0; i < strlen(word); i++){
if(ch == word[i]){ left--; word[i] = ' '; bad = 0; }
}
if(bad) chance--;
if(!left && chance) win = true;
if(!chance && !left) lose = true;
}
<span style="font-size:10px;">#include <cstdio>
int go(int p, int q, int t);
int num[30];
int n, k, m, left;
int main(){
while(scanf("%d%d%d", &n, &k, &m) != EOF){
left = n;
int p1 = n, p2 = 1;
for(int i = 1; i <= n; i++) num[i] = i;
while(left){
p1 = go(p1, 1, k);
p2 = go(p2, -1, m);
printf("%3d", p1); left--;
if(p2 != p1) { printf("%3d", p2); left--; }
num[p1] = num[p2] = 0;
if(left) printf(",");
}
printf("\n");
}
return 0;
}
int go(int p, int q, int t){
while(t--){
do{ p = (p - 1 + q + n) % n + 1; }while(num[p] == 0); //p-1使标号由1~n变为0~n-1,再按照常规方式寻找p-1的下一位置,最后将标号加1由0~n-1还原至1~n
} //走到下一个非0的数字
return p;
}</span>
例题4.4 信息解码(考虑下面的01串序列:0,00,01,10,000,001,010,011,100,101,110,……它对应着一个编码头的各个字符,每小节以三个二进制位表示本节编码长度,以编码长度个1表示本节结束,以三个0位表示本文本结束。题目要求对给定二进制编码文本解码。例如编码头为$#**,编码文本为0100000101101100011100101000,则应该这样解码:010(编码长度为2)00(#)00(#)10(*)11(小节结束)011(编码长度为3)000(\)111(小节结束)001(编码长度为1)0($)1(小节结束)000(编码结束)。)
<span style="font-size:10px;">#include<stdio.h>
#include<string.h>
int code[8][1<<8];
int readchar(){
for(;;) {
int ch = getchar();
if(ch != '\n' && ch != '\r') return ch;
}
}
int readint(int c){ //有些编码文本很长,可能会由多行组成,此函数是方便读取编码文本的
int v = 0;
while(c--) v = v * 2 + readchar() - '0';
return v;
}
int readcodes(){
memset(code, 0, sizeof(code));
code[1][0] = readchar(); //直接调到下一行开始读取,先用readchar读取第一个字符再用普通的getchar读取剩余的字符直到遇到\n,防止不必要的错误
for(int len = 2; len <= 7; len++) {
for(int i = 0; i < (1<<len)-1; i++) {
int ch = getchar();
if(ch == EOF) return 0;
if(ch == '\n' || ch == '\r') return 1; //\n 换行,将当前位置移到下一行开头,\r 回车,将当前位置移到本行开头
code[len][i] = ch;
}
}
return 1;
}
int main() {
while(readcodes()) {
for(;;) {
int len = readint(3); //先读取字节头,来查看本节编码长度
if(len == 0) break;
for(;;) {
int v = readint(len); //读取本节的编码,至遇到全1结束
if(v == (1 << len)-1) break;
putchar(code[len][v]);
}
}
putchar('\n');
}
return 0;
}</span>
java 动态规划算法递归算法的时间复杂度=递归的次数递归函数本身的时间复杂度*
5V to 3V3通过AMS1117-3.3,将电压降至3V3,钽电容是必须的。蜂鸣器电路通过ss8050的NPN三极管实现对蜂鸣器的控制LED电路通过限流电阻对LED的电流和亮度进行控制。但每种颜色所配合的电阻还需实验,达到LED能亮同时又不晃眼睛的效果。...
ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, mLmtdReptStr);adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);mSpinner.setAd
在执行roslaunch mbot_description arbotix_mbot_with_camera_xacro.launch文件时,即包含arbotix模块的程序时,报错No module named ‘rospkg’ 。报错No module named 'rospkg'经过对大家文章的查看,发现基本集中在把环境配置为python3.或者安装rospkg。但是仍没有解决。查看opt/ros/melodic/lib/python2.7/dist-packages,发现根本没有ro.
什么是数组扁平化数组扁平化是指将一个多维数组变为一维数组reduce 方法实现reduce 本身就是一个迭代循环器,通常用于累加,所以根据这一特点有以下:const arr1 = [1,[4,6],[8,3,[19,38]]]function flatten(arr) { return arr.reduce((result, item)=> { return re...
一、简介 WW 的发展使得基于因特网的应用程序不再局限于静态或者简单的动态内容提供。传统的一些以软件包形式发布应用程序例如报表系统等都在逐渐搬到因特网上。但是这两者之间有着天壤之别,虽然对于数据获取、业务处理等方面基本类似,但是最大的差别在于用户界面。为了能在web浏览器上显示要求用户界面使用 HTML以及图片的方式来展现数据,而传统的一些利用操作系统本身的控件来开发的用户界面无法适应琳琅满目
开篇身份认证,对于一个安全的应用来说,是第一道门槛,它为后续所有的安全措施提供了“身份”这样一个关键信息。通常每个公司会有好几个外部应用,如果每一个应用使用独立的账号体系,管理起来会非常复杂,用户也需要保存好几个账号密码,严重影响使用体验。而且公司内部的各个管理或开发系统,比如各种服务器、confluence、jira、gitlab等也都使用单独的账号,一个开发人员要记住各种纷繁杂乱的账号和密码,如果不提前保存下来,根本不可能能靠记忆完成输入。这时,如何设计一个简单易用的身份认证体系就显得尤为重要
命令行启动code如果你的系统是Linux系统(我使用的是Ubuntu 16.04)这样就可以直接使用 code + filename来编辑文件(就像vi + filename)如果你的系统是MacOS 就需要在vscode里面按 command + shift + p 之后输入 shell 基本上在第一提示里面就会显示安装code,如图所示转载于:https://www.cnblo...
默认写法就是转发:return的字符串将对应的前端页面转发到要求的url上配置了视图解析器的viewsresolver @RequestMapping("/hello/{a}/{b}") public String hello(@PathVariable int a, @PathVariable int b, Model model) { model.addAttribute("haha", "结果:" + (a + b)); return "hello"; }没有视图解析器
问题分析自己写的系统必须基于opencv 2.x,而ros kinetic自带了opencv3的版本。于是在编译时报错:/usr/bin/ld: CMakeFiles/xxxx.cpp.o: undefined reference to symbol '_ZN2cv6String10deallocateEv'/opt/ros/kinetic/lib/x86_64-linux-gnu/l...
你是否在编写 LaTeX 过程中遇到了编译器“不给力”,无法自动补全、缩进等问题?本文比较了流行的 LaTeX 的编译器,并简要分析了其优势与不足,最终给出解决方案。
蚁群算法解决TSP问题。Python