根据数据量猜解法
- 常数指令操作量 10^7 ~ 10^8,以此来猜测自己设计的算法有没有可能在规定时间内通过
| #include <vector> |
| #include <iostream> |
| |
| using namespace std; |
| |
| int res; |
| vector<pair<int, int>> arr; |
| |
| |
| void generate(int n, int blood, int curIndex, int steps) { |
| |
| if (blood <= 0) { |
| res = min(res, steps); |
| return; |
| } |
| |
| if (curIndex == n) return; |
| |
| for (int i = curIndex; i < n; ++i) { |
| |
| int damage = (arr[i].first < blood) ? arr[i].second : arr[i].second * 2; |
| blood -= damage; |
| |
| swap(arr[i], arr[curIndex]); |
| |
| generate(n, blood, curIndex + 1, steps + 1); |
| |
| blood += damage; |
| swap(arr[i], arr[curIndex]); |
| } |
| } |
| |
| int main() { |
| arr.resize(10); |
| int times; |
| cin >> times; |
| for (int n, blood; times > 0; times--) { |
| cin >> n >> blood; |
| res = 0x7fffffff; |
| |
| for (int i = 0; i < n; ++i) |
| cin >> arr[i].second >> arr[i].first; |
| generate(n, blood, 0, 0); |
| if (res == 0x7fffffff) res = -1; |
| cout << res << endl; |
| } |
| } |
| #include <string> |
| |
| using namespace std; |
| |
| class Solution { |
| public: |
| bool isPalindrome(int x) { |
| |
| if (x < 0) return false; |
| |
| string str; |
| while (x > 0) { |
| |
| str += x % 10; |
| x /= 10; |
| } |
| int left = 0; |
| int right = str.length() - 1; |
| while (left < right) { |
| if (str[left] != str[right]) return false; |
| left++; |
| right--; |
| } |
| return true; |
| } |
| }; |
| #include <valarray> |
| |
| using namespace std; |
| |
| class Solution { |
| public: |
| bool isPalindrome(int x) { |
| if (x < 0) return false; |
| |
| int len = 0; |
| for (int i = x; i > 0; i /= 10) len++; |
| |
| for (int offset = 0; offset < len / 2; offset++) { |
| int left = (x / (int) (pow(10, len - offset - 1))) % 10; |
| int right = (x / (int) (pow(10, offset))) % 10; |
| if (left != right) return false; |
| } |
| return true; |
| } |
| }; |
| using namespace std; |
| |
| class Solution { |
| public: |
| bool isPalindrome(int x) { |
| if (x < 0) return false; |
| int offset = 1; |
| |
| while (x / offset >= 10) |
| offset *= 10; |
| while (x != 0) { |
| if (x / offset != x % 10) return false; |
| |
| x = (x % offset) / 10; |
| offset /= 100; |
| } |
| return true; |
| } |
| }; |
1 <= len(L) <= 18
1 <= len(R) <= 18
L
和 R
是表示 [1, 10^18)
范围的整数的字符串。
int(L) <= int(R)
| #include <vector> |
| #include <iostream> |
| #include <string> |
| #include <valarray> |
| |
| using namespace std; |
| |
| class Solution { |
| public: |
| bool isPalindrome(long long x) { |
| if (x < 0) return false; |
| long long offset = 1; |
| |
| while (x / offset >= 10) |
| offset *= 10; |
| while (x != 0) { |
| if (x / offset != x % 10) return false; |
| |
| x = (x % offset) / 10; |
| offset /= 100; |
| } |
| return true; |
| } |
| |
| long long getNumber(string nums) { |
| long long res = 0; |
| for (int i = 0; i < nums.length(); ++i) |
| res = res * 10 + nums[i] - '0'; |
| return res; |
| } |
| |
| int superpalindromesInRange(string left, string right) { |
| long long l = getNumber(left); |
| long long r = getNumber(right); |
| |
| long long start; |
| if (pow((long long) sqrt(l), 2) == l) { |
| start = (long long) sqrt(l); |
| } else { |
| start = (long long) sqrt(l) + 1; |
| } |
| |
| long long end = (long long) sqrt(r); |
| |
| int res = 0; |
| |
| for (long long cur = start; cur <= end; cur++) |
| |
| if (isPalindrome(cur) && isPalindrome(cur * cur)) |
| res++; |
| return res; |
| } |
| }; |
- 方案二:根据种子生成一个回文数,再判断这个回文数的平方是否回文。遍历的是种子,数据量缩小到
10^5
| #include <vector> |
| #include <iostream> |
| #include <string> |
| #include <valarray> |
| |
| using namespace std; |
| |
| class Solution { |
| public: |
| |
| bool isPalindrome(long long x) { |
| long long offset = 1; |
| |
| while (x / offset >= 10) |
| offset *= 10; |
| while (x != 0) { |
| if (x / offset != x % 10) return false; |
| |
| x = (x % offset) / 10; |
| offset /= 100; |
| } |
| return true; |
| } |
| |
| |
| long long parse(string nums) { |
| long long res = 0; |
| for (int i = 0; i < nums.length(); ++i) |
| res = res * 10 + nums[i] - '0'; |
| return res; |
| } |
| |
| |
| pair<long long, long long> generate(int x) { |
| long long first = x, second = x; |
| for (int i = x / 10; i > 0; i /= 10) |
| first = first * 10 + i % 10; |
| for (int i = x; i > 0; i /= 10) |
| second = second * 10 + i % 10; |
| return make_pair(first, second); |
| } |
| |
| |
| bool check(int start, int end, int q) { |
| if ((q >= start && q <= end) |
| && isPalindrome((long long) q * q)) |
| return true; |
| return false; |
| } |
| |
| int superpalindromesInRange(string left, string right) { |
| long long l = parse(left); |
| long long r = parse(right); |
| |
| long long start; |
| if (pow((long long) sqrt(l), 2) == l) { |
| start = (long long) sqrt(l); |
| } else { |
| start = (long long) sqrt(l) + 1; |
| } |
| |
| long long end = (long long) sqrt(r); |
| |
| int res = 0; |
| for (int seed = 1; seed < 1e5; ++seed) { |
| auto item = generate(seed); |
| |
| if (item.first > end) break; |
| |
| if (item.second < start) continue; |
| if (check(start, end, item.first)) res++; |
| if (check(start, end, item.second)) res++; |
| } |
| return res; |
| } |
| }; |
本文作者:n1ce2cv
本文链接:https://www.cnblogs.com/sprinining/p/18449832
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步