题解:AT_utpc2012_01 2012年12月02日
AC_Simulator · · 题解
题目大意
以
举例:
2005 年05 月20 日,月份和日期组成的数字为0520 ,经过重新排列后可以得到2005 。
解题思路
为方便处理,可以采用字符串存储年月日。\
考虑定义一个字符串
代码实现
#include <bits/stdc++.h>
using namespace std;
int main()
{
string y, m, d;
getline(cin, y, '/'); // 按照题目要求输入(getline 函数具体用法见文末)
getline(cin, m, '/');
cin >> d;
string st = m + d; // 把月份和日期合成一个字符串
sort(st.begin(), st.end()); // 排序后得到最小的排列
bool p = 0; // 用于标记是否是“好日子”
do { // 一定要用 do_while,用 while 会忽略最小的排列
if (st == y) { // 判断是否可以组成年份
p = 1;
break;
}
} while (next_permutation(st.begin(), st.end())); // next_permutation 函数求下一个全排列(具体用法见文末)
if (p)
printf("yes\n"); // 判断并输出
else
printf("no\n");
return 0;
}
总结
- 算法:模拟、枚举
- 考察点:全排列
备注
getline(it,s,ch)函数用于从it 读取数据,当读取到ch 结束。结果存储在s 里(ch 会被读入,但不会被存储)。next_permutation(l,r)函数用于求区间[l,r) 的下一个全排列,并存放在原来的空间里。若没有下一个全排列,该函数返回false。