A 冰狱寒岚
签到
代码:
#include<bits/stdc++.h> using namespace std; int main(){ int t; cin>>t; while(t--){ int n; cin>>n; if(n < 1024){ printf("%d ", n); } else { if(n % 2048 < 1024){ printf("%d ", n % 1024); } else { printf("%d ", n % 1024 - 1024); } } } return 0; }
B 光之屏障
大意:
给你两个整数 x 和 y,让你求一个整数 z,满足 x≤z≤y
且 z 是 2的方幂。
题解:
筛出所有2的次方比较
代码:
#include<bits/stdc++.h> #define ll long long using namespace std; long long nums[1000000]; int ant = 1; void f(){ long long ans = 1; while(ans < 10000000000){ nums[ant] = ans; ans= ans*2; ant++; } } int main(){ f(); int t; cin>>t; while(t--){ int x,y; scanf("%d%d", &x, &y); for(int i = 1; i < ant; i++){ if(nums[i] > y || nums[i] > 1000000000){ printf("-1\n"); break; } if(nums[i] >= x){ printf("%lld\n", nums[i]); break; } } } return 0; }
C 寒潭烟光
大意:
给出一个数组的前缀和的平均数和一个数字
要求求出将这个数字加到这个数组的最前面后的前缀和平均数
题解:
加一个数在前面前缀和求和就会多n+1个这个数,然后加上原来的和再除以n+1就行了
代码:
#include<bits/stdc++.h> using namespace std; int main(){ int t; cin>>t; while(t--){ long long n,f,x; scanf("%lld%lld%lld", &n, &f, &x); long long ans = ((x * (n + 1)) + (n * f)) / (n + 1); printf("%lld\n", ans); } }
D 金蛇狂舞
题目大意:
使用 上取整、下取整、阶乘、算术平方根 四种运算,完成对一个数字的变换。
题解:
直接搜索明显超时,看到数据范围很小,遂考虑打表。
代码:
#include<bits/stdc++.h> #define INF 0x3f3f3f3f using namespace std; int ans; int nums[7][7] = {0, -1, -1, -1, -1, -1, -1, 1, 0, -1, -1, -1, -1, -1, 1, 1, 0, 7, 4, 1, -1, 2, 1, 3, 0, 2, 4, -1, 2, 1, 1, 3, 0, 2, 6, 2, 1, 1, 6, 3, 0, -1, 2, 1, 1, 7, 5, 2, 0}; int ss(int n) { int x = 1; for (int i = 1; i <= n; ++i) { x *= i; } return x; } void dfs(int n, int begin, int end, int to) { if (n == to) { ans = min(begin, ans); return; } if (begin >= end) { return; } dfs(ceil(sqrt(n)), begin + 1, end, to); dfs(ss(n), begin + 1, end, to); dfs(floor(sqrt(n)), begin + 1, end, to); return; } int main() { int t; cin >> t; while (t--) { int x, y; cin >> x >> y; printf("%d\n", nums[x - 1][y - 1]); } // } // freopen("1.out", "w", stdout); // for (int i = 1; i <= 7; i++) { // for (int j = 1; j <= 7; j++) { // ans = INF; // dfs(i, 0, 7, j); // if (ans == INF) { // printf("-1\n"); // } else { // printf("%d\n", ans); // } // } // } // fclose(stdout); }
E 暗灭侵蚀
大意:
有 3 个跳跳棋,坐标分别为 a,b,c。
每个棋子都可以以 最右侧 的棋子为中点跳跃,若棋子 x 以棋子 y 为中点跳跃,到达的位置为 2y−x。
求最少通过多少次操作,能使得至少一个棋子坐标≥N
。
题解:
排序更新就得了
代码:
#include<bits/stdc++.h> #define INF 0x3f3f3f3f using namespace std; int nums[4]; int main() { int t; cin>>t; while(t--){ int n; long long ans = 0; scanf("%d%d%d%d", &nums[1], &nums[2], &nums[3], &n); sort(nums + 1, nums + 4); while(nums[3] < n){ nums[1] = (2 * nums[3]) - nums[1]; ans++; sort(nums + 1, nums + 4); } printf("%lld\n", ans); } }