第一篇博客——冬夜小记。

HDU的几道水题。
自己感觉有一些小的注意点。
码一下。

HDU 1098在这里插入图片描述

其实我觉得,这是一道数学题…

解题思路:数学归纳法

f(x)=5x13+13x5+kax
假设当x=n时,65|f(x)成立,那一定有 65|f(n+1)成立,那么65|(f(n+1)-f(n)) 成立。
通过二项展开可以得到只要18+k*a可以被65整除就可以了。
(PS:13、5都是质数,用二项式定理的时候结果一定是13或5的倍数!)
所以在0~64之间遍历就ok。
(65肯定不对,如果超过65的话,e.g.66相当于65+1,65k可以不看)

放个代码。

#include<iostream>
using namespace std;

int main(){
    int k,a;
    while(cin>>k){
        for(a=0;a<=65;a++){
            if((18+k*a)%65==0) break;
        }
        if(a==66) cout<<"no"<<endl;
        else cout<<a<<endl;
    }
    return 0;
}
HDU 1001

(看着极其简单,就是一直出wrong answer!!!)
在这里插入图片描述
一拿到这道题,正常思维:高斯求和嘛!然后开始用公式了:n*(n+1)/2,觉得多简单,然后submit之后就是wrong answer,我刚开始以为是blank line的问题,后来发现怎么调都不对,查了下别人的博客,发现有一句话很重要但没注意:You may assume the result will be in the range of 32-bit signed integer. 所以是n*(n+1)超了范围……

根据一篇博客上面写的如下可以解决:

#include<iostream>
using namespace std;

int main(){
    int n;
    while(cin>>n){
        if(n%2==0) cout<<n/2*(n+1)<<endl<<endl;
        else cout<<(n+1)/2*n<<endl<<endl;
    }
    return 0;
}

先判断一下n的奇偶性,把n或n+1先/2,这样就不会超范围辣~

PS:有时候你发现,最笨的方法,好像,毫无难度……
在这里插入图片描述哭了。

另附:
刚开始以为自己blank line错了,就问XL怎么样使输出的最后一个数字后面没有空行。XL提供的方法不错,记小本本上:
思路:先把第一个数输出,以后再输出的时候先输出一个空行,再输出数,perfect。
方法:设一个flag=0,输入第一个数后,flag++,然后判断,flag为1时,只输出数,flag不为1时,既输出空行又输出数。

HDU 1004

在这里插入图片描述

然后是我写的代码,我觉得海星……
想说一个注意点,就是用while(cin>>n)的时候,如果在里面放了什么计数的之类,一定要记得初始化!!!!!!

#include<iostream>
#include<string>
using namespace std;

int main(){
    int N;
    string color[1000];
    while(cin>>N){
        int flag[1000]={};
        int max=1,k=0;
        if(N==0) return 0;
        else{
            cin>>color[0];
            flag[0]++;
            for(int i=1;i<N;i++){
                cin>>color[i];
                flag[i]++;
                for(int j=0;j<i;j++){
                    if(color[i]==color[j]) flag[i]=flag[j]+1;
                }
                if(flag[i]>max){
                    max=flag[i];
                    k=i;
                }
            }
            cout<<color[k]<<endl;    
        }
    }
    return 0;
}

这里面涉及到两个问题,书上有但我不会的,搜索出来的:
1.如何输出数组中最大的数的(值及其)下标?
在这里插入图片描述
也是假定一个max或者min,比较然后赋值就ok了。

2.将数组初始化为0:

  • 全局数组
       int arr[10]; //声明时不赋值,默认值为0
  • 局部数组
       int arr[10] = {};
  • 指针
       int* arr = new int [10];
       for (int i = 0; i < 10; i ++) arr[i] = 0; //动态获取的内存,默认值undefined

第一次写还有点小激动呢!
希望以后的OJ题也是好好做,好好记笔记啦。
晚安。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值