2.19数据结构与算法学习日记(蓝桥杯省赛二分贪心)

题目描述

有 N 个瓶子,编号 1∼N,放在架子上。

比如有 55 个瓶子:

2,1,3,5,4

要求每次拿起 2 个瓶子,交换它们的位置。

经过若干次后,使得瓶子的序号为:

1,2,3,4,5

对于这么简单的情况,显然,至少需要交换 2 次就可以复位。

如果瓶子更多呢?你可以通过编程来解决。

输入格式

第一行:一个正整数 N(N<10000),表示瓶子的数目。

第二行:N 个正整数,用空格分开,表示瓶子目前的排列情况。

输出格式

输出数据为一行一个正整数,表示至少交换多少次,才能完成排序。

输入输出样例

输入 #1复制

复制代码
5
3 1 2 5 4

输出 #1复制

复制代码
3

输入 #2复制

复制代码
5
5 4 3 2 1

输出 #2复制

复制代码
2

说明/提示

时限 1 秒, 256M。蓝桥杯 2016 年第七届省赛

蓝桥杯 2016 年省赛 B 组 I 题。

题目分析

1,根据题目,每个编号为i的瓶子回到位置数组下标为i的位置去,所以在交换时把编号为i的瓶子与数组下标为i的交换,这时保证他回到原位

2,这样能保证一个回到原位,那就可以由局部最优推出全局最优

3,先判断当前数 ai​ 的位置是否正确,如果正确,直接跳过。否则交换次数加一,从当前位置往后找对应位置的答案。

代码示例

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int a[100010],ans,num;
int main(){
      int n;
      cin>>n;
      for(int i=1;i<=n;i++)
      {
          cin>>a[i];
      }
    for(int j=1;j<=n;j++)//循环第j个位置瓶子
    {
        for(int i=1;i<=n;i++)//查找这位置瓶子回归所需的次数
        {
            if(a[i]!=i){swap(a[a[i]],a[i]);ans++;}//交换,次数加一
        }
    }


cout<<ans;




}

题目描述

儿童节那天有 K 位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。

小明一共有 N 块巧克力,其中第 i 块是 Hi​×Wi​ 的方格组成的长方形。

为了公平起见,小明需要从这 N 块巧克力中切出 K 块巧克力分给小朋友们。切出的巧克力需要满足:

  1. 形状是正方形,边长是整数。

  2. 大小相同。

例如一块 6×56×5 的巧克力可以切出 66 块 2×22×2 的巧克力或者 22 块 3×33×3 的巧克力。

当然小朋友们都希望得到的巧克力尽可能大,你能帮小 Hi​ 计算出最大的边长是多少么?

输入格式

第一行包含两个整数 N 和 K。(1≤N,K≤105)。

以下 N 行每行包含两个整数 Hi​ 和 Wi​。(1≤Hi​,Wi​≤105)。

输入保证每位小朋友至少能获得一块 1×1 的巧克力。

输出格式

输出切出的正方形巧克力最大可能的边长。

输入输出样例

输入 #1复制

复制代码
2 10  
6 5  
5 6  

输出 #1复制

复制代码
2

说明/提示

蓝桥杯 2022 省赛

题目分析

1,首先二分正方形的边长,判断这边长所分的巧克力块数

2,如果巧克力块数大于小孩子个数,那么增大边长,如果小于,则减小边长

3,求巧克力块数并进行判断

bool ches(int x){

int sum=0;

for(int i=1;i<=n;i++)sum+=(h[i]/x)*(w[i]/x);

return sum>=k;

}

代码示例

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int h[100010],w[100010],n,k;
bool ches(int x){//求巧克力块数并判断
      int sum=0;
      for(int i=1;i<=n;i++)sum+=(h[i]/x)*(w[i]/x);
      return sum>=k;
}
int main(){
      cin>>n>>k;
      for(int i=1;i<=n;i++){
        cin>>h[i]>>w[i];
      }
    int l=1,r=100010,ans=0;
    while(l<=r){//二分答案
        int mid=(l+r)/2;
        if(ches(mid)){ans=mid;l=mid+1;}
        else r=mid-1;


    }

cout<<ans;

}
相关推荐
西岸行者10 小时前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意11 小时前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
qq_4592344212 小时前
【题库】| 商用密码应用安全性评估从业人员考核题库(四十)
职场和发展·密码学·学习方法·考核·商用密码·商用密码应用安全性评估·密评
敲敲了个代码13 小时前
[特殊字符] 空数组的迷惑行为:为什么 every 为真,some 为假?
前端·javascript·react.js·面试·职场和发展
别催小唐敲代码13 小时前
嵌入式学习路线
学习
毛小茛14 小时前
计算机系统概论——校验码
学习
babe小鑫14 小时前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms15 小时前
ROS2知识大白话
笔记·学习·ros2
在这habit之下15 小时前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。15 小时前
2026.2.25监控学习
学习