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个整数。

输出描述:

输出最小修改。

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

相关文章

学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习...
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面...
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生...
Can’t connect to local MySQL server through socket \'/v...
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 ...
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服...