问题 A: 切西瓜
题目描述
群众想要吃瓜,于是给你一个瓜让你切,但是作为考验
告诉你西瓜的重量,问你能否将这个西瓜分成两部分,每个部分都是偶数。
输入
输入一行,包含一个整数weight,表示西瓜的重量1 <= weight <= 100
输出
输出一行,见样例。
样例输入
【输入样例1】
8
【输入样例2】
3
样例输出
【输出样例1】
YES, you can divide the watermelon into two even parts.
【输出样例2】
NO, you can't divide the watermelon into two even parts.
提示
要注意检查你的输出格式要跟样例输出一模一样才能通过,尤其别忘了句子最后的小点哦
题解:这题看似简单,其实有陷阱,因为2这个数虽然是偶数,但只能分成1和1(0和2等于没分)
所以2要特判一下
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int w;
cin>>w;
if(w==2)
{
cout<<"NO,"<<" you can't divide the watermelon into two even parts."<<endl;
return 0;
}
if(w%2==0)
cout<<"YES,"<<" you can divide the watermelon into two even parts."<<endl;
else if(w%2!=0)
cout<<"NO,"<<" you can't divide the watermelon into two even parts."<<endl;
}
问题 B: 魔法药水
题目描述
小H陷入了一个迷宫中,迷宫里有一个可怕的怪兽,血量有N点,小H有三瓶魔法药水,分别可以使怪兽损失a%、b%、c%的血量(之后怪兽的血量会向下取整),小H想合理地运用这三瓶药水,使怪兽失去尽可能多的血量
注意:每瓶药水只能用一次
输入
一行,四个整数 N,a,b,c
输出
一行,一个整数w,表示最多能使得怪兽扣减多少血量
样例输入
100 20 15 0
样例输出
32
提示
5≤N≤109,0≤a,b,c≤100
题解:
这题其实是道贪心,只要多试几个样例就会发现:
扣的血多的应该多放在前面攻击。
所以排序解决即可。
代码:
#include<bits/stdc++.h>
using namespace std;
int a[4];
int main()
{
int n;
cin>>n;
for(int i=1;i<=3;i++)cin>>a[i];
sort(a+1,a+4);//排序(懒得用降序)
int ans=n;
for(int i=3;i>=1;i--)ans*=1-(a[i]/100.0);
cout<<n-ans<<endl;//所有血量-剩于血量=被扣血量
}
问题 D: 数的划分
题目描述
将整数 nn 分成 kk 份,且每份不能为空,问有多少种不同的分法。当 n=7, k=3n=7,k=3 时,下面三种分法被认为是相同的:1,1,51,1,5; 1,5,11,5,1; 5,1,15,1,1
输入
一行两个数 n , k。
输出
一行一个整数,即不同的分法数。
样例输入
7 3
样例输出
4
提示
样例解释
四种分法为:1,1,51,1,5;1,2,41,2,4;1,3,31,3,3;2,2,32,2,3。
数据范围与提示
6<=n<=200,2<=k<=6
题解:回溯板子题。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,k,s[205],rest;
int ans=0;
void search(int dep)
{
if(dep==k+1)
{
if(rest==0)
{
ans++;
}
return;
}
for(int i=s[dep-1];i<=rest;i++)
{
s[dep]=i;
rest-=i;
search(dep+1);
rest+=i;
}
}
int main(){
cin>>n>>k;
s[0]=1;
rest=n;
search(1);
cout<<ans<<endl;
}