自己太菜 只过了四道签到题 必须好好补补题
A题重大教训 没有用long long 浪费了几次提交
D是博弈题
结论是只要是偶数 先手必胜
一个奇数的因数一定是奇数 因为如果是偶数 这个偶数与某个整数的乘积一定不会是奇数
这个奇数减掉某个因子后 就变成了偶数
所以
- 偶数总可以变成奇数
- 奇数只可以变成偶数
- 1是奇数 谁拿到谁就输了
综上 总拿到奇数的肯定就输了
这道题其实很简单 但是自己没去想过这种博弈问题
C题是一个构造题
构造题也没做过 想不出什么思路呜呜
原则是找到有既有一般性又有可行性的方式
一般考虑将输入分成几类 再分别构造 以满足所有情况
实例是3 4 1 2 则可以构造出n=4k的所有情况 如n=8则有3 4 1 2 7 8 5 6
n=5时可以构造出4 5 1 2 3 n=6时有4 5 6 1 2 3
这样 n=4k+5 n=4k+6 n=4k+11分别就是nmod4为1 2 3的情况 就覆盖了基本所有整数
但是n=7 n<4是肯定无解的需要特判
[C忽远忽近的距离] [c++]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| #include<bits/stdc++.h> using namespace std; int main() { int n; cin>>n; if(n <= 3 || n==7) { cout << "-1" << endl; return 0; } if(n%2==0) //如果是偶数 只有是四的倍数以及其它 { if(n%4==0) { for(int i=1; i<=n/4; i++) //看是几倍 { int m=i*4; cout<<m-1<<" "<<m<<" "<<m-3<<" "<<m-2<<" "; } } else //那么就是6的倍数了 { int p=n-6; //先把最后六个数单独拿出来 把可能的四的倍数用完 for(int i=1; i<=p/4; i++) { int m=i*4; cout<<m-1<<" "<<m<<" "<<m-3<<" "<<m-2<<" "; } cout<<n - 2<<" "<<n - 1<<" "<<n<<" "<<n - 5<<" "<<n - 4<<" "<<n - 3<<" "; } } else { int m = n - 5; if(m % 4 == 0) //如果拿出最后五个剩下是四的倍数 直接就用了 { for(int i = 1;i <= m / 4;i++) { int x = i * 4; cout<<x-1<<" "<<x<<" "<<x-3<<" "<<x-2<<" "; } } else { int mm = m - 6;//一个奇数 减去5 还不是四的倍数 只能是六的倍数了 把最后六个再拿出来 把四的倍数用光 for(int i = 1;i <= mm / 4;i++) { int x = i * 4; cout<<x-1<<" "<<x<<" "<<x-3<<" "<<x-2<<" "; } cout<<m - 2<<" "<<m-1<<" "<<m<<" "<<m-5<<" "<<m-4<<" "<<m-3<<" "; //输出拿出的6 } cout<<n-1<<" "<<n<<" "<<n-4<<" "<<n-3<<" "<<n-2<<" "; //输出拿出的5 } return 0; }
|
慢慢学习这种思考方式
B题更是闻所未闻了 二分图 感觉很思维
主要是不理解为什么那样摆放是最优解? 虽然感觉是正确的
1.摆放后解不等式可以直接得答案
2.可以二分答案
3.把图画出来找规律(12个起步)
[勉强拼凑的记忆] [c++]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #include <bits/stdc++.h> using namespace std;
long long i,j,k,n,m,t,l,r,res,md;
int main(){ ios::sync_with_stdio(0); cin>>t; while(t--){ cin>>n; if(n==2) { cout<<-1<<endl; continue; } l=1;r=n;res=0; i=(n+1)/2; while(l<=r){ md=(l+r)/2; k=(md/i)*md+(md%i)*((md+i-1)/i); //通过画图得的关系式 if(k<=n){ res=max(res,md);l=md+1; } else r=md-1; } cout<<res<<'\n'; } }
|
E题 高中数学题 向量算算就能得答案
K题 数学大礼包 考查因字数公式 逆元等
H题 dp
J题 反悔贪心?
留坑