• CSDN竞赛第四期题解


    一、小玉家的电费

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

    #include
    #include
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    二、单词逆序

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

    #include
    #include
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

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

    #include
    #include
    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    三、小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
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    四、新型美丽数列

    题目描述:
    定义美丽数列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个整数。

    输出描述:

    输出最小修改。

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

  • 相关阅读:
    linux之后台运行命令
    Vue+iview将表格table以excel文件导出的几种方式
    鲸探发布点评:9月20日发售FPX戒指、中山大学号科考船数字藏品
    vue父组件如何向子组件传递数据?
    MySQL 学习记录 1
    【机器学习】决策树原理及scikit-learn使用
    [CISCN2019 总决赛 Day1 Web4]Laravel1
    CUDA小白 - NPP(4) 图像处理 Data Exchange and Initialization(1)
    【GB28181】wvp-GB28181-pro修改分屏监控为16画面(前端)
    Centos7.6 源码编译部署percona mysql 5.7.39-42
  • 原文地址:https://blog.csdn.net/qwer1234mnbv_/article/details/126472131