C语言算法设计

给定一个由 a-za−z 这 2626 个字符组成的字符串,统计其中哪个字符出现的次数最多。

输入格式
输入包含一行,一个字符串,长度不超过 10001000。

输出格式
输出一行,包括出现次数最多的字符和该字符出现的次数,中间以一个空格分开。如果有多个字符出现的次数相同且最多,那么输出 \text{ASCII}ASCII 码最小的那一个字符。

#include<iostream>
#include<string>
using namespace std;
int cnt[26];
int main(){
	freopen("cnt.in","r",stdin);
	freopen("cnt.out","w",stdout);
	string str;
	cin>>str;
	for(int i=0;i<str.size();i++){
		cnt[str[i]-'a']++;
	}
	int max=0;
	int index=0;
	for(int i=0;i<26;i++){
		if(max<cnt[i]){
			max=cnt[i];
			index=i;
		}
	} 
	cout<<(char)(index+'a')<<"  "<<max;
	return 0;
} 

注意:cnt[26]要定义为全局遍历方初始化为0
接上题:统计字符默许是不区分大小写,最终输出时,以大写为准。

#include<iostream>
#include<string>
using namespace std;
int cnt[26];
int main(){
//	freopen("count.in","r",stdin);
//	freopen("count.out","w",stdout);
	string str;
	cin>>str;
	for(int i=0;i<str.size();i++){
		if(str[i]>='A'&&str[i]<='Z'){
			cnt[str[i]-'A']++;
		}else{
			cnt[str[i]-'a']++;
		}
		
	}
	int max=0;
	int index=0;
	for(int i=0;i<26;i++){
		if(max<cnt[i]){
			max=cnt[i];
			index=i;	
		}	
	} 
	cout<<max<<" "<<(char)(index+'A');
	return 0;
} 

在这里插入图片描述

三人行必有我师
子曰:“三人行,必有我师”。人越多,可请教的也越多。假设有 nn 个人排成一列,每个人的知识值是一个整数,现在我们想要选取 kk 个连续的人,使得这 kk 个人的知识值之和最大,请你输出这个最大值。
本题我在自己的编译器上通过了,但在网页上却输出错误!

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
long long t[100005];
long long sum[100005];
int main() {
//    freopen("teach.in", "r", stdin);
//    freopen("teach.out", "w", stdout);
    int n, k;
    cin >> n >> k;
    for (int i = 1; i <= n; i++) {
        cin >> t[i];
    }
    for(int i=1;i<=n;i++) {
    	sum[i]=sum[i-1]+t[i];
	}
	int max=0;
	int index=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=i;j++){
			index=sum[j]-sum[j-k];
			if(index>max){
				max=index;
			}
		}
	}
	cout<<max;
    return 0;
}

在这里插入图片描述
蒜头君公司一共有 nn 名员工,今天开员工大会,有抽奖环节,不过蒜头君准备使用一种特别的抽奖规则决定奖品的归属。

他让这 nn 名员工每个人写下一个不超过 xx 的正整数,然后选取其中出现了但是出现次数最少的数,如果有多个数出现次数一样,选取数字最大的。

写下这个数的人都会得到奖品,现在告诉你每个人写的数,你来帮蒜头君算一算写下哪个数的人会获奖,有多少人会获奖。

#include <cstdio>
#include <iostream>
using namespace std;
int cnt[1000001]; // 请填上合适的数组大小
int main() {
    freopen("bonus.in", "r", stdin);
    freopen("bonus.out", "w", stdout);
    int n, x;
    cin >> n >> x;
    for (int i = 0; i < n; i++) {
        int num;
        cin >> num;
        // 这里需要添加内容
        if(num<=x&&num>0){
            cnt[num]++;
        }
    }
    // 这里需要添加内容
    int min=n;
    int index=0;
    for (int i = 1; i <= x; i++) { // 请完善 if 条件分支部分
        if (min>=cnt[i]&&cnt[i]!=0){
            min=cnt[i];
            index=i;
        }
    }
    // 这里需要添加内容
    cout<<index<<" "<<min;
    return 0;
}

求根值

#include <cmath>
#include <iostream>
using namespace std;
int main() {
    int n;
    cin >> n;
    for(int a=0;a*a<=n;a++){
        for(int b=a;a*a+b*b<=n;b++){
            for(int c=b;a*a+b*b+c*c<=n;c++){
                if(a*a+b*b+c*c==n){
                     cout<<a<<" "<<b<<" "<<c<<endl;
                }               
            }
        }
    }
    return 0;
}

贝西喜欢玩桌上扮演游戏(BRPG),所以她说服农场主约翰开车送她到商店,在那里她买了三个骰子。

S个面。每个有 S 面的骰子每一面的点数分别是 1,2,—S-1,S1,2,3,…,S−1,S。

贝西每次同时扔出三个骰子,她一直扔呀扔,试图找出三个骰子点数之和哪个出现的次数最多。

现在给定三个骰子中每个骰子的面数,求三个骰子的点数和哪个最频繁出现。如果有多解,输出最小的一个。

#include <cstdio>
#include <iostream>
using namespace std;
int cnt[100];
int main() {
    freopen("dice.in", "r", stdin);
    freopen("dice.out", "w", stdout);
    int a, b, c;
    cin >> a >> b >> c;
    for (int i = 1; i <= a; i++) {
        for (int j = 1; j <= b; j++) {
            for (int k = 1; k <= c; k++) {
                //这里需要添加合适的代码
                cnt[i+j+k]++;
                if(cnt[0]<cnt[i+j+k]){
                    cnt[0]=cnt[i+j+k];
                }
            }
        }
    }
    int ans = 1;
    for (int i = 1; i<=100/*这里需要添加合适的代码*/; i++) {
        if (cnt[i]>cnt[ans]/*这里需要添加合适的代码*/) {
            ans = i;
        }
    }
    cout << ans << endl;
    return 0;
}

12321,123321123321 都有一个共同的特征,就是无论从左到右读还是从右向左读,都是相同的。这样的数叫做 回文数。

现在要从 55 位或 66 位的十进制整数中找出各个数位之和等于 nn 的回文数。

#include <iostream>
#include <cstdio>
using namespace std;
int main() {
    freopen("palindrome.in", "r", stdin);
    freopen("palindrome.out", "w", stdout);
    int n;
    cin >> n;
    int a,b,c,d,e,f;
    bool m=false;
    for(int i=10000;i<=99999;i++){
        a=i/10000;
        b=(i%10000)/1000;
        c=(i%1000)/100;
        d=(i%100)/10;
        e=i%10;
		if(a==e&&b==d&&a+b+c+d+e==n) {
			cout<<i<<endl;
			m=true;
		}
    }
     for(int i=100000;i<=999999;i++){
        a=i/100000;
        b=(i%100000)/10000;
        c=(i%10000)/1000;
        d=(i%1000)/100;
        e=(i%100)/10;
        f=(i%10);
		if(a==f&&b==e&&c==d&&a+b+c+d+e+f==n) {
			cout<<i<<endl;
			m=true;
		}
    }
    if(!m){
    	cout<<"-1"<<endl;	
	}
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
算法设计与分析》目录: 第一篇引入篇 第1章算法概述1.1用计算机求解问题与算法 1.1.1用计算机求解问题的步骤 1.1.2算法及其要素和特性 1.1.3算法设计及基本方法 1.1.4从算法到实现 1.2算法描述 1.2.1算法描述简介 1.2.2算法描述约定 1.2.3一个简单问题的求解过程 1.3现代常用算法概览* 1.3.1压缩算法 1.3.2加密算法 1.3.3人工智能算法 1.3.4并行算法 1.3.5其他实用算法 第2章算法分析基础 2.1算法分析体系及计量 2.1.1算法分析的评价体系 2.1.2算法的时间复杂性 2.1.3算法的空间复杂性 2.1.4NP完全性问题 2.2算法分析实例 2.2.1非递归算法分析 2.2.2递归算法分析 2.2.3提高算法质量 第二篇基础篇 第3章算法基本工具和优化技巧3.1循环与递归 3.1.1循环设计要点 3.1.2递归设计要点 3.1.3循环与递归的比较 3.2算法与数据结构 3.2.1原始信息与处理结果的对应存储 3.2.2数组使信息有序化 3.2.3数组记录状态信息 3.2.4大整数存储及运算 3.2.5构造趣味矩阵 3.3优化算法的基本技巧 3.3.1算术运算的妙用 3.3.2标志量的妙用 3.3.3信息数字化 3.4优化算法的数学模型 3.4.1杨辉三角形的应用 3.4.2最大公约数的应用 3.4.3公倍数的应用 3.4.4斐波那契数列的应用 3.4.5递推关系求解方程 习题 第三篇核心篇 第4章基本的算法策略4.1迭代算法 4.1.1递推法 4.1.2倒推法 4.1.3迭代法解方程 4.2蛮力法 4.2.1枚举法 4.2.2其他范例 4.3分治算法 4.3.1分治算法框架 4.3.2二分法 4.3.3二分法变异 4.3.4其他分治方法 4.4贪婪算法 4.4.1可绝对贪婪问题 4.4.2相对或近似贪婪问题 4.4.3贪婪策略算法设计框架 4.5动态规划 4.5.1认识动态规划 4.5.2动态规划算法设计框架 4.5.3突出阶段性的动态规划应用 4.5.4突出递推的动态规划应用 4.6算法策略间的比较 4.6.1不同算法策略特点小结 4.6.2算法策略间的关联 4.6.3算法策略侧重的问题类型 习题 第5章图的搜索算法 5.1图搜索概述 5.1.1图及其术语 5.1.2图搜索及其术语 5.2广度优先搜索 5.2.1算法框架 5.2.2广度优先搜索的应用 5.3深度优先搜索 5.3.1算法框架 5.3.2深度优先搜索的应用 5.4回溯法 5.4.1认识回溯法 5.4.2回溯法算法框架 5.4.3应用1——基本的回溯搜索 5.4.4应用2——排列及排列树的回溯搜索 5.4.5应用3——最优化问题的回溯搜索 5.5分支限界法 5.5.1分支搜索算法 5.5.2分支限界搜索算法 5.5.3算法框架 5.6 图的搜索算法小结 习题 第四篇应用篇 第6章算法设计实践6.1循环赛日程表 6.2求3个数的最小公倍数 6.3猴子选大王 6.4最大子段和问题 6.5背包问题 6.5.1与利润无关的背包问题 6.5.2与利润有关的背包问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彭祥.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值