微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CSDN竞赛第四期题解

一、小玉家的电费

题目描述:
夏天到了,各家各户的用电量都增加了许多,相应的电费也交的更多了。小玉家今天收到了一份电费通知单。小玉看到上面写:据闽价电[2006]27号规定,月用电量在150千瓦时及以下部分按每千瓦时0.4463元执行,月用电量在151~400千瓦时的部分按每千瓦时0.4663元执行,月用电量在401千瓦时及以上部分按每千瓦时0.5663元执行;小玉想自己验证一下,电费通知单上应交电费的数目到底是否正确呢。请编写一个程序,已知用电总计,根据电价规定,计算出应的电费应该是多少。
思路
算就完了

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
	const double l1 = 0.4463, l2 = 0.4663, l3 = 0.5663;
	double sum;
	int n;
	cin >> n;
	if (n <= 150)
		sum = n * l1;
	else if (n <= 400)
		sum = 150 * l1 + (n - 150)*l2;
	else
		sum = 150 * l1 + 250 * l2 + (n - 400)*l3;
	cout <<fixed<< setprecision(1) << sum;
	return 0;
}

二、单词逆序

题目描述:
对于一个字符串,请设计一个算法,只在字符串的单词间做逆序调整,也就是说,字符串由一些由空格分隔的部分组成,你需要将这些部分逆序。 给定一个原字符串A,请返回逆序后的字符串。例,输入”I am a boy!“输出”boy! a am I“
思路
用双指针从后向前读,遇到空格进行打印并更新指针,注意对头部元素单独处理

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string a;
	getline(cin, a);
	int len = a.length();
	int k = len - 1;
	for (int i = len-1; i>=0; i--)
	{
		if (i == 0)
		{
			for(int j=0;j<=k;j++)
				cout << a[j];
			cout << " ";
		}
		if (a[i] == ' ')
		{
			for (int j = i+1; j <= k; j++)
				cout << a[j];
			cout << " ";
			k = i-1;
		}
	}
	return 0;
}

利用string类的substr也可以,进行截取打印

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s1;
	getline(cin,s1);
	int flag=0;//记录空格位置
	for(int i=s1.size()-1;i>=0;i--)
	{
		flag++;
		if(s1[i]==' ')
		{
			cout<<s1.substr(i+1,flag-1)<<' ';
			flag=0;
		}
	}
	cout<<s1.substr(0,flag)<<endl;
	return 0;
}

三、小Q整数分割

题目描述:
小Q决定把一个整数n,分割为k个整数。 每个整数必须大于等于1。 小Q有多少方案。
思路
采用递归求解十分简单
对分割数k,当k=1时就不用分割了,一组分割方案已完成,返回1,方案数加1
最小整数为1,那么就以1为结果开始分。
由数学计算知被分的数总存在一方不大于n/k,一方大于。例如50分为1和49…一直到25 25 后面的就重复了,分三份则有16 17 17,因此只需考虑较小数的划分,即限定条件,i<=(n/k)
递归中将剩余数即n-i递归,此时已分出去一份i,因此还需分k-1个数,此时起点变为i,依次向下递归,返回的所有结果和即为所求答案,由于数据较大,最后取个模

#include<iostream>
using namespace std;
const long N=1e9+7;
int departnum(int n,int k,int num)
{
	if(k==1)
		return 1;
	else{
		int count=0;
		for(int i=num;i<=(n/k);i++)
		count+=departnum(n-i,k-1,i);
		return count;
		}
}
int main()
{
	int n,k;
	cin>>n>>k;
	cout<<departnum(n,k,1)%N;
}

四、新型美丽数列

题目描述:
定义美丽数列A: 1. 数列中相邻的数越是靠内相对大小加一,a[2]=a[1]+1,a[n-2]=a[n-1]+1… 2. 距离边缘距离相等的数的大小相等:a[0] = a[n-1],a[1] = a[n-2]… 通过修改最小的数字使得给定数列变成美丽数列。 修改后的值必须仍是正整数
输入描述:

第一行输入整数n。(1<=n<=1000)表示数列的大小。
第二行输入n个整数。

输出描述:

输出最小修改

暂时不会,留个坑,以后来补

原文地址:https://www.jb51.cc/wenti/3282494.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐