题目链接: http://codeforces.com/contest/861/problem/B
题目描述: 每个楼梯上有相同数量的数, 都是从1开始, 给你m个不矛盾的信息, 问你能不能判断n在第几层
解题思路: 这道题我看到的时候觉得只要能算出来一层有多少个数就可以了, 就是暴力层数, 就可以了, 复杂度为O(n^2), 但是要注意的情况就是有的时候就算不知道确切的层数, 我也可以判断n在几层, 所以我的想法错了.....改进就是将所有可能的答案推进vector中, 最后看看可能答案是不是一个数就可以了
代码:
#include <iostream> #include <cstdio> #include <map> #include <iterator> #include <string> #include <algorithm> #include <vector> #include <cmath> using namespace std; typedef long long ll; const int maxn = 108; int a[maxn]; int b[maxn]; vector<int> ans; int main() { int n, m; cin >> n >> m; for( int i = 1; i <= m; i++ ) { cin >> a[i] >> b[i]; } for( int e = 1; e <= 100; e++ ) { int flag = 1; for( int i = 1; i <= m; i++ ) { int floor = a[i]/e + (a[i]%e!=0); if( floor != b[i] ) { flag = 0; break; } } if( flag ) { ans.push_back(e); } } int flag = 1; vector<int>::iterator it = ans.begin(); int res = n/(*it) + (n%(*it)!=0); for( it = ans.begin(); it != ans.end(); it++ ) { if( (n/(*it) + (n%(*it)!=0)) != res ) { flag = 0; break; } } if( flag ) { cout << res << endl; } else { cout << -1 << endl; } return 0; }
思考: 在转化等价条件的时候必须严格证明其正确性