CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/16
本次题目与往常一样有四个,这边贴出我当时的解题代码。
输入描述:
第一行输入整数n.(1<=n<=1000)表示圆的数量。
第二行输入n个圆的半径。(1<=r<=1000)
输出描述:
输出染色面积,保留小数点后3位。
输入样例:
3
1 2 3
输出样例:
18.849
这题乍一看以为是染色问题,但仔细一想比染色问题简单多了。只需要记录下奇数层圆环的面积和偶数层圆环的面积,然后判断最外层属于偶数层还是奇数层即可。
#include
#include
#include
#include
#include
#include
double solution(int n, std::vector<int>& vec){
sort(vec.begin(),vec.end());
double result;
double PI =3.14159265354;
// TODO:
double ji_area = 0.0;
double ou_area = 0.0;
for(int i=0;i<n;i++){
if(i%2==0){
if(i==0){
ou_area+=PI*vec[i]*vec[i];
}else{
ou_area+=PI*(vec[i]*vec[i]-vec[i-1]*vec[i-1]);
}
}if
(i%2!=0){
ji_area+=PI*(vec[i]*vec[i]-vec[i-1]*vec[i-1]);
}
}if
(n%2==0){
result=ji_area;
}else{
result=ou_area;
}return result;
} int main() {
int n;
std::vector<int> vec;
std::cin>>n;
std::string line_0, token_0;
getline(std::cin >> std::ws,line_0);
std::stringstream tokens_0(line_0);
while(std::getline(tokens_0, token_0, ' ')){
vec.push_back(std::stoi(token_0));
}
double result = solution(n,vec);
std::cout<<std::fixed<<std::setprecision(3)<<result<<std::endl;
return 0;
}
还需要注意的是精度问题,题目要求精度是3位小数,所以 π \pi π需要尽可能地取得精确点。
输入描述:
第一行输入整数n,m,k.(1<=n,m,k<=100)
第二行输入n个整数的权值。(1<=a<=1000)
输出描述:
输出最小距离
输入样例:
7 3 50
62 0 0 0 99 33 22
输出样例:
3
这题也很简单,从节点 m m m分别向左、向右找满足条件的值即可。
#include
#include
#include
#include
int solution(int n, int m, int k, std::vector<int>& vec){
int result=0;
// TODO:
int start = m-1;
int index1 = -10000;
int index2=-10000;
for(int i=start+1;i<n;i++){
if(k>=vec[i]&&vec[i]>0){
index1=i;
break;
}
}
for(int i=start-1;i>=0;i--){
if(k>=vec[i]&&vec[i]>0){
index2=i;
break;
}
}
result = abs(start-index1)>abs(start-index2)?abs(start-index2):abs(start-index1);
return result;
}
int main() {
int n;
int m;
int k;
std::vector<int> vec;
std::cin>>n;
std::cin>>m;
std::cin>>k;
std::string line_0, token_0;
getline(std::cin >> std::ws,line_0);
std::stringstream tokens_0(line_0);
while(std::getline(tokens_0, token_0, ' ')) {
vec.push_back(std::stoi(token_0));
}
int result = solution(n, m, k,vec);
std::cout<<result<<std::endl;
return 0;
}
第一行输入宝物的数量n(1 这是一道经典的背包问题。背包问题的讲解非常推荐看代码随想录。 这一题对我来说难度挺高,我也不知道怎么做。。所以当时用非常投机取巧的方式过了 40 % 40\% 40%。 后面看别人题解时说是一道原题,原题出处戳此,属于贪心题型。 正确解法如下:输出描述:
输出最优方案下能获取的最大价值V。
说明:
v代表每个宝物自己的价值
m代表每个宝物的质量
V代表最大价值
M代表总质量
输入样例:
5 10
2 3
5 3
4 5
6 2
4 2
输出样例:
10
#include
4. 圆桌
输入描述:
第一行输入一个整数N,(1<=N<=10000),代表客人的数量
接下来N行,每行两个整数li与ri,(1<=i<=N,1<=li<=ri<=1000000000)
代表第i位客人希望左边有li个空座位,右边有ri个空座位。
输出描述:
输出一个整数,代表主人需要准备的最少座位数量。
输入样例:
3
1 1
1 1
1 1
输出样例:
6
#include
#include