题目如下:
AC代码如下:
#include<iostream>
#include<stdlib.h>
using namespace std;
int opt(int n)//定义一个函数opt,用于返回n的绝对值
{
return n>=0 ? n: -n;
}
int main()
{
int n0, n1, n;
cin>>n0>>n1>>n; //输入待分配的女生人数n0、男生人数n1和寝室数n
int min = 100000, cur; //初始化最小差值min为一个较大的数,cur用于存储当前差值
int re_g=0, re_b=0, flag = 0; //re_g和re_b分别表示女生和男生被分配的寝室数量,flag用于标记是否有解
for(int i=1; i<n; i++) //遍历寝室数,i表示女生寝室数
{
int boy = n-i; //计算男生寝室数
if(n0%i == 0 && n1%boy == 0 && n0 != i && n1 != boy) //满足条件:女生人数能被女生寝室数整除,男生人数能被男生寝室数整除,且女生寝室数不等于女生人数,男生寝室数不等于男生人数
{
cur = abs(n0/i - n1/boy); //计算当前差值
if(min>cur) //如果当前差值小于最小差值
{
if(n0/i == 1 || n1/boy == 1) continue; //如果某种性别只有一个人住一间寝室,则跳过
min = cur; //更新最小差值
re_g = i; re_b = boy; //更新女生和男生被分配的寝室数量
flag = 1; //标记有解
}
}
}
if(flag == 1) cout<<re_g<<" "<<re_b; //如果有解,则输出女生和男生被分配的寝室数量
else cout<<"No Solution"; //如果无解,则输出"No Solution"
return 0;
}
反思:
一开始测试点4怎么都不能AC,百思不得其解,上网看了别人的代码后,发现问题出在记录最小差值的变量 min 的初始定义上,你能看出问题吗?
int min = n+1;//不合格
int min = 100000;//AC
我一开始将min初始化为n+1,是想当然地以为最大差值不会超过n,毕竟宿舍一共就n个,怎么会差值怎么会超过n呢?
但后来仔细想一下,min记录的男女每个宿舍人数的差值最小值啊,跟n的大小并没有直接关系啊, 这样看, min的初始值大概并不能根据题目输入值简单界定,那就定的大些吧。
总的来说,慎终如始,则无坏事~
~ ღ ʕ̡̢̡•̫͡•ʔ̢̡̢ ღ ~
~希望对你有启发~