题目解释:
有一个长度为n的单元格,每个单元格上都有一个整数,最开始都是0. 一开始芯片在第一个位置,每当一个回合结束时(最开始也视为一个回合),芯片所在的单元格的整数+1.每回合结束时我们都有两个操作:
操作1:将芯片移动到下一个单元格(例如,如果芯片在 i单元格,则将其移动到 i + 1单元格)。如果芯片在最后一格,则无法进行此操作;
操作2:选择任意一个 x单元格,将芯片传送到该单元格。可以选择芯片当前所在的单元格;
每个单元格都有一个目标整数c[i]你的目标就是让每个单元格上的整数变为c[i],并且操作尽可能少的操作2,问最少使用多少次操作2可以让单元格上的整数都达成目标。
解题思路:
考察:贪心、数学
观察发现如果c[i] >= c[i + 1]那么每次使用操作2传送回 i 的时候能用操作1把芯片移到i+1的格子。也就是说如果有这么一个连续子数组c[i] >= c[i + 1] >= c[i + 2] ...答案就是芯片传送回第i个格子的次数。可以将整个数组划分为若干段这样不上升的子数组。一旦c[i] < c[i + 1]就是新的一段的开始。需要注意的细节是我们在走c[i]的时候能把c[i + 1]也给走了,也就是新的一段需要减去上一段的最后一个元素。由于最开始就在第一个位置,所以需要将最开始的上一段置为1方便统计答案。
a[i] - a[i-1] > 0,贡献值a[i] - a[i-1],对于a[1]特殊处理一下,a[1]--,因为a[1]直接先操作了一次
参考:https://www.cnblogs.com/qdhys/p/17855152.html
#include<bits/stdc++.h>
using namespace std;
const int N = 100010, mod = 1e9 + 7;
typedef long long ll;
typedef pair<int,int> pii;
void solve()
{
int n;
cin >> n;
vector<int> a(n + 1);
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = n; i > 0; i--) a[i] -= a[i - 1];
a[1]--;
ll ans = 0;
for (int i = 1; i <= n; i++)
if (a[i] > 0)
ans += a[i];
cout << ans << '\n';
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int _;
_ = 1;
cin >> _;
while(_--)
{
solve();
}
return 0;
}
原题链接:登录—专业IT笔试面试备考平台_牛客网
题目解释:
解题思路:
考察:递推 数学 快速幂
数据范围较小,根据公式用快速幂递推即可。
函数 logX(Y):求x为底y的对数值
log(Y) :求e为底的y的对数值
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll f[110];
ll qmi(ll a,ll k,ll p)
{
ll res=1%p,t=a;
while(k)
{
if(k&1){
res=res*t%p;
}
t=t*t%p;
k>>=1;
}
return res;
}
int main()
{
int f1,f2,p,a,n;
cin>>f[1]>>f[2]>>p>>a>>n;
for(int i=3;i<=n;i++)
{
f[i]=log2(qmi(f[i-1],f[i-2],p)+1)+a;
}
for(int i=1;i<=n;i++)
cout<<f[i]<<" ";
}
原题链接:登录—专业IT笔试面试备考平台_牛客网
题目解释:
解题思路:
考察:细节
求最大冷场程度,即求相邻客人的最大距离。L表示圆的周长。当相邻的k个客人离席时,会产生最大距离,依次遍历求解即可。
(i+k+1)%n 表示k个客人离席后顺时针相邻的下一个客人序号
(xj-xi+L)modL表示xi到xj的顺时针距离
注意:客人的位置并不是从小到大按顺序给出,所以要排序!
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e6+10;
int a[N];
int main()
{
int n,l,k;
cin>>n>>l>>k;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);//注意要排序!!
int sum=0;
for(int i=0;i<n;i++)
{
// cout<<"i:"<<i<<" "<<(i+k+1)%n<<endl;
// cout<<a[i]<<" "<<a[(i+k+1)%n] <<endl;
// cout<<(a[(i+k+1)%n]-a[i]+l)%l<<endl;
sum=max(sum,(a[(i+k+1)%n]-a[i]+l)%l);
}
cout<<sum<<endl;
}