0808

快速幂

输入a,b,p;
求a的b次幂对p求余。
把b拆成二进制数,通过位运算得到最低位来巧妙降低复杂度。

int a,b,p;
cin>>a>>b>>p;
int ans = 1;
for(;b;b>>=1)
{
    if(b&1)
        ans = (long long)ans*a%p;
    a = (long long)a*a%p;
}

成对变换

对于非负整数n

  • 若n为偶数,则n^1等于n+1
  • 若n为奇数,则n^1等于n-1

lowbit运算

lowbit(n)定义为非负整数n在二进制表示下“最低位的1及其后边所有的0”构成的数值。

lowbit(n) = n&(-n);

原理:计算机中数值都由补码形式储存,而负数的补码为原码取反加一。假设一个整数0-k-1位都是0,那么他的相反数的补码0-k-1为也都是0,但是第k位为1,k+1之后的与该正数都互为反,所以两者做与运算可以直接求得所求。

奇怪的汉诺塔

三个的汉诺塔的递推公式

f(n) = 2*f(n-1)+1

但是如果是四个(从A到D)的话,就可以先把n个中的前k个放到一个塔上,另外n-k个都是按照三个汉诺塔的来放到第四个(D),然后再将前k个按照四个柱子的方法移到第四个柱子。

d(n) = min(2*d(k)+f(n-k))

其中k < n;

a[1] = 1;
b[1] = 1;
b[0] = 0;
for(int i=2;i<=12;i++)
{
    b[i] = 2*b[i-1]+1;
    a[i] = inf;
    for(int j=1;j<=i;j++)
        a[i] = min(a[i],a[j]*2+b[i-j]);
    
}

前缀和(poj3263)

N头牛,告诉最高的牛高H在p处,然后告诉A可以看到B,可以知道B的高大于等于A的高,A与B之间的牛要比A低

map<pair<int,int>,bool> existed;
int c[10010],d[10010];
int main() 
{
    int n,i,h,r;
    while(cin>>n>>i>>h>>r)
    {
        int a,b;
        for(int i=0;i<r;i++)
        {
            cin>>a>>b;
            if(a>b)swap(a,b);
            if(existed[make_pair(a,b)])continue;
            d[a+1]--;d[b]++;
            existed[make_pair(a,b)] = 1;
        }
        for(int i=1;i<=n;i++)
        {
            c[i] = c[i-1]+d[i];
            printf("%d\n",h+c[i]);
        }
    }
    return 0;
}
  • 输入之后要调整a和b的大小
  • 判重
  • 用另外一个数组记录,然后通过前缀和来表示高度之间的差值(核心)

递归枚举

  • 递归思路是将基本单元缩小

从1-n这n个整数中随机选取任意多个,输出所有可能的方案。

分析

  • 从1-n开始,每个都只有两个选择
  • 对于每两个选择,分别进行后面数字的选择
  • 对于一个数字,做完决策后把痕迹删除
int n;
vector<int> chosen;
void calc(int x)
{
    if(x==n+1)//满足条件即输出
    {
        for(int i=0;i<chosen.size();i++)
        printf("%d ",chosen[i]);
        puts("");//输出完会有回车
        return ;
    }
    calc(x+1);
    chosen.push_back(x);
    calc(x+1);
    chosen.pop_back();//一定要消除痕迹
}
int main() 
{
    while(cin>>n)
        calc(1);
    return 0;
}

递归实现排列型枚举

从1-n 这n(n < 10)个整数排除一行后随机打乱顺序,输出所有可能的次序

  • 先排好n-1,然后对于第n个有选哪个的问题,所以要遍历剩下的
  • 要记录之前选过的,需要一个chosen数组
  • 最后要删除标记
int n;
int order[21];
int chosen[21];
void calc(int k)
{
    if(k==n+1)
    {
        for(int i=1;i<=n;i++)
            printf("%d ",order[i]);
        puts("");
        return;
    }
    for(int i=1;i<=n;i++)
    {
        if(chosen[i])
            continue;
        order[k] = i;
        chosen[i] = 1;
        calc(k+1);
        chosen[i] = 0;
    }
}

int main() 
{
    while(cin>>n)
        calc(1);
    return 0;
}

Fractal Streets(poj3889)

题意不在赘述

递归,从n递归到1,解决最小问题,经过一步一步转化得到n级城市的坐标。

  • 房屋必须要从0开始,因为要方便确定属于哪一个区
  • 在城市升级过程中要格外小心坐标转换
  • 最后计算距离时sqrt的输出
pair<long long,long long> calc(int n,long long m)
{
    if(n==0)
        return make_pair(0,0);
    long long len = 1<<(n-1),cnt = 1<<(2*n-2);
    pair<long long,long long> pos = calc(n-1,m%cnt);
    long long x = pos.first,y = pos.second;
    long long z = m/cnt;
    if(z==0)
        return make_pair(y,x);
    if(z==1)
        return make_pair(x+len,y);
    if(z==2)
        return make_pair(x+len,y+len);
    if(z==3)
        return make_pair(len-y-1,2*len-x-1);
}

int main() 
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        long long h,o;
        cin>>n>>h>>o;
        pair<long long,long long>a = calc(n,h-1);
        //cout<<a.first<<a.second<<endl;
        pair<long long,long long>b = calc(n,o-1);
        //cout<<b.first<<b.second<<endl;
        printf("%.0f\n",sqrt((double)(a.first-b.first)*(a.first-b.first)+(double)(a.second-b.second)*(a.second-b.second))*10) ;
        //cout<<dis*10<<endl;
    }
    return 0;
}

总结

  • 今天虽然只看了二十页,有些难题还没有AC,样例过了始终无法AC。
  • 二进制的部分要经常复习
  • 递推和递归条件一开始就要清楚,遇到答案不符的情况可以输出过程量测试找bug
  • 尽量不调试。

转载于:https://www.cnblogs.com/1625--H/p/9446036.html

(1)求职者端(Web 前端) 岗位浏览与搜索: 智能推荐首页:基于 “专业背景 + 求职意向” 推荐匹配岗位(如 “计算机专业硕士” 优先推荐 “高校计算机教师岗”“实验员岗”),展示岗位核心信息(学校名称、岗位名称、薪资范围、截止日期)。 多条件筛选:支持按 “岗位类型(教学岗 / 科研岗 / 行政岗)、学历要求(硕士 / 博士)、地区(华北 / 华东等)、学校层次(985/211 / 双非)” 组合筛选,结果按 “匹配度 / 发布时间 / 薪资” 排序。 岗位详情页:展示 “岗位职责、任职要求、福利待遇、应聘流程、联系人信息”,提供 “收藏岗位、一键投递简历、查看该岗位竞争热度(如‘已有 230 人投递’)” 功能。 个人求职中心: 简历管理:支持创建多版本简历(如 “教学岗专用简历”“科研岗专用简历”),包含 “基本信息、教育经历、科研成果、教学经验、获奖情况” 等模块,支持 PDF 导出和在线编辑。 应聘跟踪:记录 “已投递岗位、简历状态(已接收 / 筛选中 / 面试通知 / 已录用)、截止日期提醒”,对 “3 天内即将截止的岗位” 自动推送提醒。 竞争分析:针对已投递岗位,展示 “求职者学历分布(博士占比 75%)、专业匹配度排名(你的匹配度 85 分,超过 80% 竞争者)”,辅助评估自身竞争力。 (2)高校招聘负责人端(Web 管理端) 岗位管理: 岗位发布:填写 “岗位名称、招聘人数、学历要求、专业方向、岗位职责、薪资范围、应聘方式” 等信息,支持上传 “岗位说明书附件”,设置 “自动截止日期” 和 “简历接收邮箱”。 批量操作:对 “已过期岗位” 进行批量下架,对 “热门岗位(投递量>100)” 设置 “自动置顶”,支持 “岗位信息批量导出(Excel 格式)”。 简历筛选: 智能初筛:系统自动对投递简历进行 “匹配度评分”
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值