C2 - 4th → C3 - 4th → B4 犯错及纠错(超低级)

C2 - 4th - A - Sum of Odd Integers

 题不难,基本上二十分钟(还是落后大部队很久)就写出了大题代码,然后一交WA on test 3,然后调调调调,调了好久都没过,最后发现是精度的问题,,,,

WA on test 3:

#include<bits/stdc++.h>
using namespace std;

int main() {
//    freopen("in.txt","r",stdin);
    int t,n,k;
    cin >>t;
    while(t--){
        cin >> n >> k;
        if(n%2&&k%2&&n>=k*k)
            cout << "YES" << endl;
        else if(!(n%2)&&!(k%2)&&n>=k*k)
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    return 0;
}

以为题目给的范围没超int,定义的时候就想当然了,但是你看见那么大个k*k了吗?10 ^ 7 * 10 ^ 7这不是铁超int?知道自己犯了这个错差点没气死,没办法,水平不足

AC:

#include<bits/stdc++.h>
using namespace std;

int main() {
//    freopen("in.txt","r",stdin);
    unsigned long long int t, n, k;
    cin >> t;
    while(t--) {
        cin >> n >> k;
        if(((n % 2 == 0 && k % 2 == 0) || (n % 2 == 1  && k % 2 == 1)) && (n >= k * k) )
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    return 0;
}

其实只加个unsigned long long 就行了,其他的是我之前感觉不对的地方瞎调的,结果没改到点子上。

—————————————————到了当天晚上C3——————————————————

 C3 - 4th - B - Fadi and LCM

这一天就很水逆,同样的问题跌倒两次。。

AC1:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;

unsigned long long int gcd(unsigned long long int a, unsigned long long int b) {
    return b ? gcd(b, a % b) : a;
}
int main() {
//    freopen("in.txt", "r", stdin);
//    freopen("out.txt", "w", stdout);
    unsigned long long int x, i;
    unsigned long long int maxd = 1e12+2;
    cin >> x;
    maxd = min(x,maxd);
    for(i = 2; i <= sqrt(x) ; i++) {
        if(x % i == 0 && gcd(i,x/i) == 1) {
            maxd = min(maxd,x/i);
        }
    }
    cout << x/maxd << " " <<  maxd;
    return 0;
}

 AC2:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;

long long gcd(long long  a,long long  b){
    return b ? gcd(b,a%b) : a;
}
int main() {
//    freopen("in.txt", "r", stdin);
//    freopen("out.txt", "w", stdout);
    unsigned long long int x,i;
    unsigned long long int maxd = 1;
    cin >> x;
    for(i = sqrt(x); i >=1 ; i--){
        if(x%i == 0 && gcd(i,x/i)==1){
            maxd = i;
            break;
        }
    }
    cout << maxd << " " << (x/maxd);
    return 0;
}

整体思路差不多,不复述了,问题就出在自己写的GCD函数上,没考虑到函数也得适配范围。。。属实不应该。当然也知道了C++其实有自带的GCD函数,__gcd(a,b),就可以用。。

这次WA了好多次,还是最后气不过找到原网址扒出来测试用例才知道自己的错,呜呜呜。

——————————————————隔天B4—————————————————————

 

B4 - G - Out of Sorts

这题乍一看头大,耐心读完题之后其实并没有很难,考察的一个知识点也很明确——二分查找,只要这个会外加一点小细节就可以完美AC,当然这得感谢我队友找板子找到了二分查找的真正写法,不然这题也是没得A。

题意:给定一个公式,按所给公式求出数组,然后对这个未排序的数组使用二分查找找每一个数组元素,输出能够找到的个数。比如输入5 8 1 3 3,根据公式得到数组是6 1 4 7 2,然后直接对这个数组用二分查找找6 1 4 7 2,最终只能找到4 7(为什么找不到1?因为按照最正确的二分查找写法的的确确就是找不到1)

思路:按题意走一遍就完事了,注意数据范围。可喜的是这次我终于注意到了数据范围而且没有出错!!!可能是因为样例给的提示性太强。。。反正争取以后不再犯类似错误!2021/5/8 C++第二次作业 Problem D: 整数的封装 很久之前这也犯了一次简单错误。。

AC码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
unsigned long long x[maxn];
int bs(unsigned long long int a[], int r, int l, unsigned long long int x) {
    int mid = (r + l) / 2;
    while(r >= l) {
        mid = (r + l) / 2;
        if(a[mid] > x)
            r = mid - 1;
        else if(a[mid] < x)
            l = mid + 1;
        else
            return mid;
    }
    return 0;
}
int main() {
    int n;
    int cnt = 0;
    unsigned long long m, a, c;
    cin >> n >> m >> a >> c >> x[0];
    for(int i = 1; i <= n; i++)
        x[i] = (a * x[i - 1] + c) % m;
    for(int i = 1; i <= n; i++)
        if(bs(x, n, 1, x[i]))
            cnt++;
    cout << cnt;
    return 0;
}

一篇二分查找的文章,感觉说的很精准,完美解决这道题以及上面提及到的为什么找不到1的问题。用C语言实现二分查找算法

“显然这样做的话实在是太理想了,按出数学的思路,这样做是根本取不到边界的,如果考虑到C语言中的×××会自动舍弃小数,那么对于左边界是我们这样写是完全可以的,但是右边界是永远都不会取到的,如果取中间值取到非整数,是否会在其他方面影响到我们的查找结果呢,答案是不会的,若产生自动舍弃小数的状况,仅仅只会影响我们在一个有序序列中查找元素的位置与分段查找所分段的长度,并不会影响我们的查找结果,如果要解决边界问题,我们可以使分段所产生的边界偏移,由于mid元素已经被判断过了,所以我们分段的时候段的边界可以直接舍弃掉mid元素,使得边界为mid+1或mid-1,这样我们便完成了整型数组的二分查找,实现代码如下:(见链接)”

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值