我的错题集


原题链接:Problem - B - Codeforces

题目解释:

有一个长度为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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值