A.直接模拟。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include<bits/stdc++.h> using namespace std; int c,v0,v1,a,l; int main() { ios::sync_with_stdio(0); cin >> c >> v0 >> v1 >> a >> l; int ans = 0,now = l,v = v0-a; while(1) { ans++; now -= l; v += a; if(v > v1) v = v1; now += v; if(now >= c) break; } cout << ans << endl; return 0; }
B.相等弧长对应的圆周角相等。圆周角是对应圆心角的一半。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include<bits/stdc++.h> using namespace std; int n,a; int main() { ios::sync_with_stdio(0); cin >> n >> a; double t = 180.0/n; int ans; double minn = 360; for(int i = 1;i <= n-2;i++) { if(abs(i*t-a) < minn) { ans = i+2; minn = abs(i*t-a); } } cout << "2 1 " << ans << endl; return 0; }
D.统计数值大于等于位置的个数和数值小于位置的个数,以及每个偏差值的个数,每次向右移动的时候,可以O(1)更新答案,注意每次更新三个计数。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include<bits/stdc++.h> using namespace std; int n,a[1000005],cnt[1000005]; int main() { ios::sync_with_stdio(0); cin >> n; for(int i = 1;i <= n;i++) cin >> a[i]; long long sum = 0,cntl = 0,cntr = 0; for(int i = 1;i <= n;i++) { sum += abs(a[i]-i); if(a[i] >= i) { cntl++; cnt[a[i]-i]++; } else cntr++; } long long ans = sum; int num = 0; for(int i = 1;i < n;i++) { cntl -= cnt[i-1]; cntr += cnt[i-1]; sum = sum-cntl+cntr-abs(a[n-i+1]-n-1)+abs(a[n-i+1]-1); if(a[n-i+1]+i-1 < n) cnt[a[n-i+1]+i-1]++; cntl++; cntr--; if(sum < ans) { ans = sum; num = i; } } cout << ans << " " << num << endl; return 0; }