晓龙coding
15分钟前

模拟:

#include<iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    for (int i = n; i >= 0; i--) {
        int a;
        cin >> a;
        if (a == 0) continue;
        else if (a > 0 && i != n) cout << "+";
        else if (a < 0) cout << "-";
        if (abs(a) != 1 || (abs(a) == 1 && i == 0)) cout << abs(a);
        if (i > 1) cout << "x^" << i;
        else if (i == 1) cout << "x";
    }
    return 0;
}



handlecoding
23分钟前

求助,用的模版代码提交到力扣210题课程表2上面死活过不去,错误用例单独跑的时候输出全部是正确的,但是一提交就WA,太奇怪了,求大神支招

carbon.png

const int N = 1e5 + 10;
int n, m;

// 图的数据结构
int head[N], e[N], ne[N], idx; // head表示N个节点邻接链表的头节点idx值,e[i]表示i指针存放的图节点编号,next[i]表示i指针下一个位置,idx标识唯一指针

int q[N], d[N]; // 队列和入度矩阵

// 添加 a->b 的边
void add(int a, int b)
{
    e[idx] = b, ne[idx] = head[a], head[a] = idx++;
}

int topsort()
{
    int hh = 0, tt = -1; // 队列头和尾下标

    // 将所有入度为0的点加入队列
    for(int i = 0; i < n; i++)
        if(!d[i])
        {
            q[++tt] = i;
        }


    // 当队列不为空时
    while(hh <= tt)
    {
        int temp = q[hh++]; // 取队头元素

        // 开始扩展队头
        for(int i = head[temp]; i != -1; i = ne[i])
        {
            int j = e[i];
            d[j]--; // 将对应节点的入度-1,代表删去这条边
            if(d[j] == 0) q[++tt] = j; // 如果此时入度为0,表示节点的前置条件满足了,入队
        }
    }

    return tt == n-1; // 队列里面是否总共入队了n个节点
}


class Solution {
public:
    vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
        memset(head, -1, sizeof head);
        n = numCourses, m = prerequisites.size();
        vector<int> res;

        if(m == 0)
        {
            for(int i = 0; i < numCourses; i++)
                res.push_back(i);
            return res;
        }
        for(auto& vec : prerequisites)
        {
            add(vec[1], vec[0]);
            d[vec[0]]++;
        }

        if(topsort())
        {
            for(int i = 0; i < n; i++)
                res.push_back(q[i]); // 以1为开始
        }

        return res;
    }
};



Yvette
32分钟前

农夫约翰的 n 头奶牛站在从牛棚到牧场的直线路径上,直线路径可看作一维数轴。
因为他的奶牛喜欢保持电子邮件联系,所以约翰在这条直线路径上安装了 m 个 wifi 基站,以便所有的奶牛都被无线网络覆盖。

所有基站都以相同功率工作。

功率为 r 的基站,如果其所在位置为 x,则它可以将数据传输到 [x−r,x+r] 范围内的任何奶牛处。

如果基站的功率为 0,则只会覆盖与其位于同一位置的奶牛。

请你确定,在满足所有奶牛都被无线网络覆盖的前提下,基站的最小运行功率。

输入格式
第一行包含两个整数 n,m,表示奶牛的数量和基站的数量。

第二行包含 n 个整数 a1,a2,…,an,表示每个奶牛的位置坐标。不同奶牛的坐标位置可能相同。所有奶牛的坐标 ai 是按非严格单调递增顺序给出的。

第三行包含 m 个整数 b1,b2,…,bm,表示每个基站的位置坐标,不同基站的坐标位置可能相同。所有基站的坐标 bi 是按非严格单调递增顺序给出的。

输出格式
一个数,表示在满足所有奶牛都被无线网络覆盖的前提下,基站的最小运行功率。答案四舍五入到整数。

数据范围
前六个测试点满足,1≤n,m≤10。
所有测试点满足,1≤n,m≤105,−109≤ai,bi≤109。

输入样例1:
3 2
-2 2 4
-3 0
输出样例1:
4
输入样例2:
5 3
1 5 10 14 17
4 11 15
输出样例2:
3

#include<iostream>
#include<cstdio>
using namespace std;
const int N=1e5+10;
int a[N],b[N];
typedef long long ll;
int n,m;

bool check(int r)
{
    for(int i=0,j=0;i<n;i++)
    {
        while(j+1<m&&a[i]>=b[j+1])j++;//找到b中第一个大于a[i]的数
        if(abs(a[i]-b[j])>r)//如果这个基站到a[i]的距离超出了半径,说明这个基站无法覆盖这个奶牛
        {
            if(j+1>=m||abs(a[i]-b[j+1])>r)return false;//如果这个基站是最后一个或者a[i]到下一个基站的距离超过了r就说明下一个基站也无法覆盖,所以这个答案不符合
        }
    }
    return true;
}

int main()
{
    cin>>n>>m;
    for(int i=0;i<n;i++)scanf("%d",&a[i]);
    for(int j=0;j<m;j++)scanf("%d",&b[j]);
    ll l=0,r=2e9;
    //二分寻找答案
    //答案必须满足答案左边的各答案都不符合条件,右边的都符合条件
    while(l<r)
    {
        int mid=(ll)(l+r)>>1;
        if(check(mid))r=mid;//符合的话找前面还有没有更小的答案
        else l=mid+1;//找后面
    }
    printf("%d\n",r);
    return 0;
}



不羁i
40分钟前

我花了三个小时吧,看了一遍y总的,然后反复看那位初中大佬的题解,时隔一天,终于差不多完全了解了
ps:这道题真不能在宿舍做,绕来绕去思绪一断就得重新开始


本题解主要是针对3个k1做了详细题解


49FB9623CA5FB3B83F494B631F882878.jpg

632C6F51F09DAD9F735C7B42970060BD.jpg

56B3A351CE14F4513199B51DD21C28FB.jpg

由于第一次发,有点拉,不知道怎么把歪过来的图片方正,只能一页分俩张,不过感觉也会更清晰点对3个k1来说,只是可能有、、大了


最后奉上代码及核心解析
ps:建议跟那位初中大佬的解析一起看吧,会清楚点

#include<iostream>
#include<algorithm>

using namespace std;
typedef long long ll;

const int N = 27;

ll a1, a2, m1, m2, k1, k2;

ll exgcd(ll a, ll b, ll &x, ll &y)
{
    if(b == 0)
    {
        x = 1; y = 0;
        return a;
    }
    else
    {
        ll d = exgcd(b, a % b, y, x);
        y -= a / b * x;
        return d;
    }
}

ll mod(ll k1, ll b)
{
    return (k1 % b + b) % b;
}

int main()
{
    int n;
    cin >> n;
    cin >> a1 >> m1;
    bool flag = 1;
    for(int i = 1; i < n; i ++ )
    {
        cin >> a2 >> m2;
        ll d = exgcd(a1, -a2, k1, k2); //k1为k1(1)
        //若不成比例则取余不为0
        if((m2 - m1) % d) {flag = 0;break;}
        //更新k1,m1,a1
        k1 = k1 * (m2 - m1) / d;    // k1(2)=k1(1)*(m2-m1)/d
        k1 = mod(k1, abs(a2 / d));  // k1(3)=mod(k1(2),abs(a2/d))
        m1 = k1 * a1 + m1;          // m1=k1(3)*a1+m1
        a1 = abs(a1 / d * a2);      // 这个abs不能省略
    }
    if(flag)
        cout << m1 << endl;
    else
        cout << -1 << endl;
    return 0;
}

QAQ
如果觉得不错,麻烦点个赞ya
QAQ




Albert_Tesla
40分钟前
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int N = 110;
vector<int>G[N];//表示每个节点的子节点集
int max_h = 1;//表示树的高度
int leaves[N];//表示每一层的叶子数
void dfs(int index, int h);
int main()
{
    int n, m;
    cin >> n >> m;//n, m分别表示总的节点数目,非叶子节点数目
    for(int i = 1; i <= m; i++ )
    {
        int parent, num, child;
        cin >> parent >> num;
        for(int j = 1; j <= num; j++ )
        {
            cin >> child;
            G[parent].pb(child);
        }
    }
    dfs(1,1);
    for(int i = 1; i <= max_h; i++)
    {
        if(i == 1)cout << leaves[i];
        else cout << " " << leaves[i];
    }
    return 0;
}
void dfs(int index, int h)//index表示节点的编号,h表示当前的高度
{
    max_h = max(h, max_h);
    if(G[index].size() == 0)
    {
        leaves[h] ++ ;
        return ;
    }
    else for(int i = 0; i < G[index].size(); i++ )dfs(G[index][i], h+1);
}



ChihiroEvil
1小时前
#include <iostream>
using namespace std;

int abs(int x)
{
    if(x>=0)return x;
    return -x;
}

int main()
{
    int x;
    cin>>x;
    cout<<abs(x)<<endl;
    return 0;
}



ChihiroEvil
1小时前
#include <iostream>
using namespace std;

int abs(int x)
{
    if(x>=0)return x;
    return -x;
}

int main()
{
    int x;
    cin>>x;
    cout<<abs(x)<<endl;
    return 0;
}



ChihiroEvil
1小时前
#include <iostream>
using namespace std;

int f(int n)
{
    if(n<=2)return 1;
    else return f(n-1)+f(n-2);
}

int main()
{
    int n;
    cin>>n;
    cout<<f(n);
    return 0;
}



Aigrl
1小时前

NOIP考点总结(初步算法篇)


1. 图与树

- 搜索

- 最短路

- 图论常用技巧 + 最小生成树详解

- 图论应用

2. 数据结构

- 数据结构入门

- 数据结构初步

- 数据结构技巧 + 应用

- 数据结构的反思总结

3. 基础算法

- 随缘更新

4. 动态规划

- 随缘更新

5. 数论

- 随缘更新

6. 骗分

- 随缘更新


NOIP考点总结(高级算法篇)


暂时不会qwq

初次编稿时间 2021/9/18




ChihiroEvil
1小时前
#include <iostream>
using namespace std;

int f(int n)
{
    if(n==1)return 1;
    else return f(n-1)*n;
}

int main()
{
    int n;
    cin>>n;
    cout<<f(n);
    return 0;
}