ccf刷题第5天c++(20170301,20170901,20171201))

分蛋糕(20170301)

【问题描述】
  小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别为a1, a2, …, an。小明想分给每个朋友至少重量为k的蛋糕。小明的朋友们已经排好队准备领蛋糕,对于每个朋友,小明总是先将自己手中编号最小的蛋糕分给他,当这个朋友所分得蛋糕的重量不到k时,再继续将剩下的蛋糕中编号最小的给他,直到小明的蛋糕分完或者这个朋友分到的蛋糕的总重量大于等于k。
  请问当小明的蛋糕分完时,总共有多少个朋友分到了蛋糕。
【输入格式】
  输入的第一行包含了两个整数n, k,意义如上所述。
  第二行包含n个正整数,依次表示a1, a2, …, an。
【输出格式】
  输出一个整数,表示有多少个朋友分到了蛋糕。
【样例输入】
6 9
2 6 5 6 3 5
【样例输出】
3
【样例说明】
  第一个朋友分到了前3块蛋糕,第二个朋友分到了第4、5块蛋糕,第三个朋友分到了最后一块蛋糕。
【评测用例规模与约定】
  对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ k ≤ 10000,1 ≤ ai ≤ 1000。

实现代码

#include<bits/stdc++.h>
using namespace std;
int main(){//怎样判断最后一个人有没有分到蛋糕? 
	int n,k,num=0,sum=0,j=0;
	cin>>n>>k;
	vector<int> vec(n);
	for(int i=0;i<n;i++)
		cin>>vec[i];
	//根据题意, 小明总是把手中编号最小的蛋糕分给朋友,并不是
	//把手中重量最小的蛋糕分给朋友,所以不需要进行排序 
	/*
	//冒泡排序
	for(int i=0;ivec[j])
				swap(vec[i],vec[j]);
		}
	} 
	*/
	//核心代码 
	for(int i=0;i<=n;i++){
		if(sum<k){
			sum+=vec[i];
		}
		else{
			sum=0;
			i--;
			num++;
			j=i;//将上一次满足蛋糕重要大于k的最后一块蛋糕的下标赋值为j
		}
	} 
	if(j==n-1)//如果j等于n-1,则说明num个朋友均分有蛋糕,并且每一位朋友的蛋糕总重量均大于k
		cout<<num;
	else cout<<num+1;//说明num个朋友有蛋糕切蛋糕重量满足条件,但是还剩余几块蛋糕,且这几块蛋糕的重量小于k,但是第num+1个朋友分到了蛋糕,所以共有num+1个朋友分到了蛋糕
	return 0;
}

打酱油(20170901)

【问题描述】
  小明带着N元钱去买酱油。酱油10块钱一瓶,商家进行促销,每买3瓶送1瓶,或者每买5瓶送2瓶。请问小明最多可以得到多少瓶酱油。
【输入格式】
  输入的第一行包含一个整数N,表示小明可用于买酱油的钱数。N是10的整数倍,N不超过300。
【输出格式】
  输出一个整数,表示小明最多可以得到多少瓶酱油。
【样例输入】
40
【样例输出】
5
【样例说明】
  把40元分成30元和10元,分别买3瓶和1瓶,其中3瓶送1瓶,共得到5瓶。
【样例输入】
80
【样例输出】
11
【样例说明】
  把80元分成30元和50元,分别买3瓶和5瓶,其中3瓶送1瓶,5瓶送2瓶,共得到11瓶。

代码

#include<bits/stdc++.h>
using namespace std;
int main(){//贪心算法 
	int n,num,m;
	cin>>n;
	num=n/10;//先计算正常情况下可以买多少瓶酱油
	m=num;
	while(m>=5){//每5瓶酱油可以送2瓶酱油,则判断一共有多少个5瓶酱油
		num+=2*(m/5);
		m%=5;
	}
	while(m>=3){//每3瓶酱油可以送1瓶酱油,则判断除开5瓶酱油部分之后,可以有多少组3瓶酱油
		num+=m/3;
		m%=3;
	} 
	cout<<num;
	return 0;
} 

最小差值(20171201)

【问题描述】
  给定n个数,请找出其中相差(差的绝对值)最小的两个数,输出它们的差值的绝对值。
【输入格式】
  输入第一行包含一个整数n。
  第二行包含n个正整数,相邻整数之间使用一个空格分隔。
【输出格式】
  输出一个整数,表示答案。
【样例输入】
5
1 5 4 8 20
【样例输出】
1
【样例说明】
  相差最小的两个数是5和4,它们之间的差值是1。
【样例输入】
5
9 3 6 1 3
【样例输出】
0
【样例说明】
  有两个相同的数3,它们之间的差值是0.
【数据规模和约定】
  对于所有评测用例,2 ≤ n ≤ 1000,每个给定的整数都是不超过10000的正整数。

代码

#include<bits/stdc++.h>
using namespace std;
int main(){//同前面的最大波动类似解法
	int n,min=10000;		
	cin>>n;
	vector<int> vec(n);
	for(int i=0;i<n;i++)
		cin>>vec[i];
	for(int i=0;i<n;i++){
		for(int j=i+1;j<n;j++){
			if(abs(vec[i]-vec[j])<=min)
				min=abs(vec[i]-vec[j]);
		}
	}cout<<min;
	return 0;
} 

你可能感兴趣的:(ccf刷题)