杂乱无章+犯过的错+构造

 

  

  

  也许你以为要将每条蛇的长度更新更新再更新,一次又一次地遍历来看看它最多可以吃到多大,知道不能再吃时通过判断有没有其他蛇来决定它能不能胜出。这个程序可以用while循环实现,while的条件是还能吃,但是这个程序我想着就头大,虽然有这个思路,但在赛场上我并没有写出来。

 

  正解:我们将蛇以大小为依据排序,所有蛇中一定以某一条为界限,它以上的都可以胜出,它和它以下的都不行(因为吃长蛇的路上只要有一处过不去,如果比A更长的B都不能胜利,那A就一定不能成为赢家,毕竟在吃吃吃以后A和B会变成同样规模的蛇)。这条特殊的边界蛇的特点就是:吃掉所有比它小的蛇,它还是吃不了比它更大的那条,这样的蛇也许不止一条,我们要的蛇所有满足这个条件的蛇中最长的那条。

  注意ai的取值范围,10^9和int是一个数量级,但做sum运算的话就开个long long。

code:

View Code

 

 

!!解引用操作解出来的是个临时变量!!

 

一道数学题:

我们知道,在10 进制数中有判断整除性的二个简单规则:一个正整数能够被3整除,当且仅当,它的各位数字之和能够被3整除;一个正整数能够被11整除,当且仅当,它的奇数位数字之和与偶数位数字之和的差能够被11整除;现在要问:对于b进制数,具有类似于10进制数的3和11的这种整除性判断的数是什么?具体地,请编写程序,输入进制的基数b,输出最小的可以如上判断整除性的数x和数y,输入输出均采用10 进制数.

 

示例 :

输入b为10,则自然要输出x为3,y为11; 若输入b为8,则要输出x为7, y为3 (例如8进制数25,按上述规则判断应能够被7和3整除,事实上,8进制数25是10进制数21,能够被7和3整除是显然的) ;若输入b为120,则要输出x为7, y为11 (请自己验证这是对的).

提示:对于10进制数,10-1=9=3*3, 10+1=11, 10进制数n可以一般地表示为:

n=ak10k+ak-110k-1+ ....+a110+a0

保持n不改变数值将10换为10-1和10+1,可以看出3和11可以如上判断整除性的理由.

 思考:如果(b+1)%x==0,这个x就是你要找的;如果(b-1)%y==0,这个y就是你要找的。

 

220与280:220的真因数之和为284,284的真因数之和是220。我们将其称之为为亲和数。

注意:若一个结构体中有一个字符数组,那么它的地址就是nameofstruct.nameofchar,不用加&,因为这已经是一个数组名,已经是一个地址了。

几个数学问题:

转圈问题:一个圆在一条线上转动,每转动过一个周长,就转一圈。但如果是在一个多边形上转动,则要考虑的不只是边长,还有边与边之间形成的夹角,这些夹角的和加起来是360°,所以多转一圈。如果是围绕着一个圆转动,也要多转一圈,这是因为圆可以看成是有无穷多边的多边形。

欧拉七桥问题:(引申出一一笔画问题)存在能够不重复地一次性走完所有道路的方法吗?

将连接着奇数条路径的路叫做奇点,可以一次性全部走完的道路有以下性质:奇点要么没有,要么有两个。若有,必是起点和终点。这是因为除了起点和终点之外的中间点在有一条进入的路的时候也一定有一条出去的点,所以其链接的一定是偶数点。

矩阵乘法:

三重循环,我这个脑子太好使了

矩阵旋转:

关键在于用好下标变换

对数器:

在没有OJ的情况下查看一算法对不对:

找另一个解决同一问题的算法,生成一套随机数据,在两算法中分别检测,如果检测结果不同则两算法至少一个错误,通过print的方法把错误找出来即可修改错误;确认无误之后喂一百万套随机数据直到无误为止。

递归复杂度:

2的64次方是一个32位十进制数,2的32次方是一个16位十进制数。

自增的细微区别:

x++的返回值是一个临时的值,这个值在当前行不能再操作;

++x的返回值是自增后的x本身。

数字的计算基础:

将十进制整数转换为二进制:

将13转换为二进制:

13 / 2 = 6 ...... 1

6   / 2 = 3 ...... 0

3   / 2 = 1 ...... 1

1   / 2 = 0 ...... 1

故13转换为二进制为1101

将十进制小数转换为二进制:

将0.05转换为二进制:

0.05*2=0.1 整数位0

0.1 *2=0.2 整数位0

0.2 *2=0.4 整数位0

0.4 *2=0.8 整数位0

0.8 *2=1.6 整数位1

故0.5整数二进制近似为:0.00001

将0.5转换为二进制:

0.5*2=1

故0.5整数二进制为0.1

float型数的储存格式:

一共32位,4个字节,第一位是符号位,1负0正,接下来8位是尾数部分(即指数),接下来23位是小数部分。

将float型小数转换为1.x*2^y,x指小数部分,用23个二进制位表示;y指指数,用七个二进制位表示。‘1’和‘.’不用表示出来。

8位可以表示-128-127,所以用那八个二进制位算出来的十进制数要减去127才是真正的指数。

作用域:

#include<bits/stdc++.h>
using namespace std;
static int x = 100;//这个x在别的文件不能extern,因为static表示了x的作用域是文件作用域
void f() {
    static int a = 1;
    int b = 1;
    a++;
    cout << a << " " << b << endl;
}
namespace A{
    int a = 1;
}
int main() {
    f();
    f();
    int a = 2;
    cout << a << endl;
    cout << A::a << endl;
    return 0;
}

 malloc问题:

在非全局区想开辟一片空间不应直接int a[100],否则会失效。

 

这样开辟出来的给Data的空间是永久的;

 

 这样就不是永久,而是在createstack函数之后就会失效。

atof函数:

stdlib.h中的函数,可以将字符串转化为double数字。

如果输入的数据杂乱无章呢,倒也不必一个字符一个字符判断,然后用atof转换,如果输入数据有规律的话,可以直接使用cin,这东西多好使啊。

getline(cin,s)读入一整行

致命BUG:搞错类型

 

 

致命BUG:在读入n之前就对主对角线上进行初始化

 

 

Problem - B - Codeforces

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int t, n, k;
int main() {
    cin.tie(0);
    cin.sync_with_stdio(false);
    cin >> t;
    while (t--) {
        cin >> n >> k;
        vector<pair<int, int>>a(n);
        for (int i = 0; i < n; i++)cin >> a[i].first;
        for (int i = 0; i < n; i++)cin >> a[i].second;
        vector<int>suf(n);
        sort(a.begin(), a.end());
        suf[n - 1] = a[n - 1].second;
        for (int i = n - 2; i >= 0; i--) {
            suf[i] = min(suf[i + 1], a[i].second);
        }
        int delta = 0, begin = 0;
        while (begin <= n - 1 && k > 0) {
            delta += k;//这个量特别巧妙,有了delta就不用依次给每个怪物减伤害,而是直接比较累加值
            while (begin <= n - 1 && a[begin].first <= delta)begin++;//此处要先判断越界,再进行别的判断
            if (begin <= n - 1)k -= suf[begin];
        }
        if (begin == n)cout << "YES" << endl;
        else cout << "NO" << endl;
    }
    return 0;
}

 不要乱用cin.tie(0) cin.sync_with_stdio(false)

 

 

 

#include <bits/stdc++.h>
using namespace std;
int n,k,tx,ty,res;
bool a[11][11];
void dfs(int person,int num){//person这人手里有num橘子
    if(person==n-1&&num==1){
        res++;
        //cout<<"win! the res is "<<res<<endl;
        return;
    }else if(num>1){
        //cout<<"the "<<person<<" person has "<<num<<" oranges"<<endl;
        for(int i=0;i<n;i++)if(a[person][i])dfs(i,num-1);
        return;
    }
}
int main(){
    cin.tie(0);
    cin.sync_with_stdio(false);
    scanf("%d%d",&n,&k);
    while(scanf("%d%d",&tx,&ty)!=EOF){
        a[tx][ty]=1;
    }
    dfs(0,k);
    cout<<res;
    return 0;
}

如果用cin输入n,k,用scanf输入矩阵的话就会寄,因为cin.sync_with_stdio就是cin和scanf关系的,要么都用cin,要么都用scanf

这题还要注意一点:最后的状态是而不是person==n-1&&num==0,状态要搞清楚,我最开始写的是num==1&&person==n-1

 (118条消息) 报错解决:力扣提交后的执行结果与执行代码的结果不一致(解答错误)_leetcode执行代码和提交结果不一致_乔卿的博客-CSDN博客

力扣提交前后输出不同:初始化问题

坐标系问题:有坐标系的题目,通过样例确定哪里是x哪里是y。

剪枝:

排序、二分(二分在有序的情况下进行)、记忆化(visit)、根据性质剪枝

空间:

128MB是3*10^7个int,512就是10的8次方了,有时候能开10的八次方

Problem - 1844B - Codeforces

遇到了几道MEX有关的题目,都是用考虑前几个数字的方法解决的,比如这题,让一个数列中满足要求的子数列尽量多,就是要让尽可能多的子数列中包含1,但不包含2或者3(因为1不是素数,但2或者3是素数),粗略地计算,把数字x放在数组首位,则有n个包含x的数列;若放在数组中间,则有(n/2)*(n/2)=(n^2)/4个包含x的数列。放在中间的被包含的次数多,放在两边的被包含的次数少,所以把1放在中间,把2,3放在两边,ac。

字符串符号匹配问题

在python文件中,

user_problem = f"The input is: \n{input_text}\n. The output should be like: \n{the_answer_should_be_like}\n."

像一个这样的字符串里,我用

user_problem.format(input_text=input_text, the_answer_should_be_like=the_answer_should_be_like)

这种方式组成user_problem,但当input_text中出现}时,会导致出现括号匹配错误的问题。

所以不要用{}了,直接用字符串加法。

posted @ 2022-08-05 21:51  _a_rk  阅读(130)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end