自己太菜 只过了四道签到题 必须好好补补题

A题重大教训 没有用long long 浪费了几次提交

D是博弈题
结论是只要是偶数 先手必胜
一个奇数的因数一定是奇数 因为如果是偶数 这个偶数与某个整数的乘积一定不会是奇数
这个奇数减掉某个因子后 就变成了偶数
所以

  1. 偶数总可以变成奇数
  2. 奇数只可以变成偶数
  3. 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题 反悔贪心?
留坑