2017省赛蓝桥杯B组
2017省赛蓝桥杯B组
5.购物单

查看代码
查看代码
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
double sum = 180.90*0.88+10.25*0.65+56.14*0.9+104.65*0.9+100.30*0.88+297.15*0.5+26.75*0.65+130.62*0.5+240.28*0.58+270.62*0.8+115.87*0.88+247.34*0.95+73.21*0.9+101.00*0.5+79.54*0.5+278.44*0.7+199.26*0.5+12.97*0.9+166.30*0.78+125.50*0.58+84.98*0.9+113.35*0.68+166.57*0.5+42.56*0.9+81.90*0.95+131.78*0.8+255.89*0.78+109.17*0.9+146.69*0.68+139.33*0.65+141.16*0.78+154.74*0.8+59.42*0.8+85.44*0.68+293.70*0.88+261.79*0.65+11.30*0.88+268.27*0.58+128.29*0.88+251.03*0.8+208.39*0.75+128.88*0.75+62.06*0.9+225.87*0.75+12.89*0.75+34.28*0.75+62.16*0.58+129.12*0.5+218.37*0.5+289.69*0.8;
int a = (int)(sum+100)/100*100;
printf("%d",a);
return 0;
}
考点:将数据输入进去看有几个100-->52个100
答案:5200
6.等差素数列

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+6;
bool ss(int a){//判断素数
if(a<2)return false;//不是素数
for(int i=2;i<=sqrt(a);i++){
if(a%i==0)return false;
}
return true;
}
int main(){
for(int q=2;q<=N;q++) {
if(!ss(q))continue;
for(int d=1;d<=N;d++){//公差
bool flag=true;
for(int j=2;j<=10;j++) {
int t=q+(j-1)*d;
if(!ss(t)){
flag=false;
break;
}
}
if(flag==true) {
cout<<d;
return 0;
}
}
}
return 0;
}
set的用法
7.承压计算
算法:动态规划(类似于数字三角形)
这个是上面的两个物品一定均分给下面一个物体(这不是dp不是取最值走)

4.方格分割
考点:dfs



法二
#include <iostream>
using namespace std;
bool vis[40][40];
int ans;
int dx[]={-1,1,0,0};//上下左右
int dy[]={0,0,-1,1};//列
void dfs(int x,int y){
//剪的是点,如果一端剪到底说明他对称点那端也到底就说明剪完
if(x==0||x==6||y==0||y==6){
ans++;
return ;
}
for(int i=0;i<4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(x==0||x==6||y==0||y==6){
continue;
}
if(!vis[nx][ny]){
vis[nx][ny]=true;
vis[6-nx][6-ny]=true;
dfs(nx,ny);
vis[nx][ny]=false;
vis[6-nx][6-ny]=false;
}
}
}
int main()
{
vis[3][3]=true;
dfs(3,3);//从中间点,因为要求剪出来的两部分完全相同即中心对称
cout<<ans/4;//四个方向旋转对称
return 0;
}
题目:取数位

考察:递归
#include<bits/stdc++.h>
using namespace std;
//计算位数
int len(int x){
if(x<10)return 1;//1位数
return len(x/10) +1;
}
//计算第k位数
int f(int x,int k ){
if(len(x)-k==0)return x%10;//末位数
return f(x/10,k);//答案
}
int main(){
int x=23574;
cout<<f(x,3);
return 0;
}
题目:最大公共子串
答案: a[i][j] =a[i-1][j-1]+1;
考动态规划转移方程->意思是公共子串到s1的第i位和s2的第j位匹配的长度为公共子串到s1的第i-1位和s2的第j-1位的长度+1
所以s1[i-1]==s2[j-1]下标比位置小1.
2.日期问题


分巧克力
二分例题:
儿童节那天有 K位小朋友到小明家做客。
小明拿出了珍藏的巧克力招待小朋友们。
小明一共有 N块巧克力,其中第&amp;amp;nbsp;&amp;lt;span id="MathJax-Element-3-Frame" class="MathJax" data-mathml="&amp;amp;lt;math xmlns=&amp;amp;quot;http://www.w3.org/1998/Math/MathML&amp;amp;quot;&amp;amp;gt;&amp;amp;lt;mi&amp;amp;gt;i&amp;amp;lt;/mi&amp;amp;gt;&amp;amp;lt;/math&amp;amp;gt;"&amp;gt;&amp;lt;span id="MathJax-Span-7" class="math"&amp;gt;i&amp;amp;nbsp;块是&amp;amp;nbsp;&amp;lt;span id="MathJax-Element-4-Frame" class="MathJax" data-mathml="&amp;amp;lt;math xmlns=&amp;amp;quot;http://www.w3.org/1998/Math/MathML&amp;amp;quot;&amp;amp;gt;&amp;amp;lt;msub&amp;amp;gt;&amp;amp;lt;mi&amp;amp;gt;H&amp;amp;lt;/mi&amp;amp;gt;&amp;amp;lt;mi&amp;amp;gt;i&amp;amp;lt;/mi&amp;amp;gt;&amp;amp;lt;/msub&amp;amp;gt;&amp;amp;lt;mo&amp;amp;gt;&amp;amp;amp;#x00D7;&amp;amp;lt;/mo&amp;amp;gt;&amp;amp;lt;msub&amp;amp;gt;&amp;amp;lt;mi&amp;amp;gt;W&amp;amp;lt;/mi&amp;amp;gt;&amp;amp;lt;mi&amp;amp;gt;i&amp;amp;lt;/mi&amp;amp;gt;&amp;amp;lt;/msub&amp;amp;gt;&amp;amp;lt;/math&amp;amp;gt;"&amp;gt;&amp;lt;span id="MathJax-Span-10" class="math"&amp;gt;&amp;lt;span id="MathJax-Span-11" class="mrow"&amp;gt;&amp;lt;span id="MathJax-Span-12" class="msubsup"&amp;gt;&amp;lt;span id="MathJax-Span-13" class="mi"&amp;gt;H&amp;lt;span id="MathJax-Span-14" class="mi"&amp;gt;i&amp;lt;span id="MathJax-Span-15" class="mo"&amp;gt;&amp;amp;times;&amp;lt;span id="MathJax-Span-16" class="msubsup"&amp;gt;&amp;lt;span id="MathJax-Span-17" class="mi"&amp;gt;W&amp;lt;span id="MathJax-Span-18" class="mi"&amp;gt;i的方格组成的长方形。
为了公平起见,小明需要从这 N块巧克力中切出&amp;amp;nbsp;&amp;lt;span id="MathJax-Element-6-Frame" class="MathJax" data-mathml="&amp;amp;lt;math xmlns=&amp;amp;quot;http://www.w3.org/1998/Math/MathML&amp;amp;quot;&amp;amp;gt;&amp;amp;lt;mi&amp;amp;gt;K&amp;amp;lt;/mi&amp;amp;gt;&amp;amp;lt;/math&amp;amp;gt;"&amp;gt;&amp;lt;span id="MathJax-Span-22" class="math"&amp;gt;K块巧克力分给小朋友们。
切出的巧克力需要满足:
- 形状是正方形,边长是整数
- 大小相同
例如一块 &amp;lt;span id="MathJax-Span-26" class="mrow"&amp;gt;&amp;lt;span id="MathJax-Span-27" class="mn"&amp;gt;6&amp;lt;span id="MathJax-Span-28" class="mo"&amp;gt;&amp;amp;times;&amp;lt;span id="MathJax-Span-29" class="mn"&amp;gt;5&amp;amp;nbsp;的巧克力可以切出&amp;amp;nbsp;&amp;lt;span id="MathJax-Element-8-Frame" class="MathJax" data-mathml="&amp;amp;lt;math xmlns=&amp;amp;quot;http://www.w3.org/1998/Math/MathML&amp;amp;quot;&amp;amp;gt;&amp;amp;lt;mn&amp;amp;gt;6&amp;amp;lt;/mn&amp;amp;gt;&amp;amp;lt;/math&amp;amp;gt;"&amp;gt;&amp;lt;span id="MathJax-Span-30" class="math"&amp;gt;6&amp;amp;nbsp;块&amp;amp;nbsp;&amp;lt;span id="MathJax-Element-9-Frame" class="MathJax" data-mathml="&amp;amp;lt;math xmlns=&amp;amp;quot;http://www.w3.org/1998/Math/MathML&amp;amp;quot;&amp;amp;gt;&amp;amp;lt;mn&amp;amp;gt;2&amp;amp;lt;/mn&amp;amp;gt;&amp;amp;lt;mo&amp;amp;gt;&amp;amp;amp;#x00D7;&amp;amp;lt;/mo&amp;amp;gt;&amp;amp;lt;mn&amp;amp;gt;2&amp;amp;lt;/mn&amp;amp;gt;&amp;amp;lt;/math&amp;amp;gt;"&amp;gt;&amp;lt;span id="MathJax-Span-33" class="math"&amp;gt;&amp;lt;span id="MathJax-Span-34" class="mrow"&amp;gt;&amp;lt;span id="MathJax-Span-35" class="mn"&amp;gt;2&amp;lt;span id="MathJax-Span-36" class="mo"&amp;gt;&amp;amp;times;&amp;lt;span id="MathJax-Span-37" class="mn"&amp;gt;2的巧克力或者&amp;amp;nbsp;&amp;lt;span id="MathJax-Element-10-Frame" class="MathJax" data-mathml="&amp;amp;lt;math xmlns=&amp;amp;quot;http://www.w3.org/1998/Math/MathML&amp;amp;quot;&amp;amp;gt;&amp;amp;lt;mn&amp;amp;gt;2&amp;amp;lt;/mn&amp;amp;gt;&amp;amp;lt;/math&amp;amp;gt;"&amp;gt;&amp;lt;span class="MJX_Assistive_MathML"&amp;gt;2&amp;amp;nbsp;块&amp;amp;nbsp;&amp;lt;span id="MathJax-Element-11-Frame" class="MathJax" data-mathml="&amp;amp;lt;math xmlns=&amp;amp;quot;http://www.w3.org/1998/Math/MathML&amp;amp;quot;&amp;amp;gt;&amp;amp;lt;mn&amp;amp;gt;3&amp;amp;lt;/mn&amp;amp;gt;&amp;amp;lt;mo&amp;amp;gt;&amp;amp;amp;#x00D7;&amp;amp;lt;/mo&amp;amp;gt;&amp;amp;lt;mn&amp;amp;gt;3&amp;amp;lt;/mn&amp;amp;gt;&amp;amp;lt;/math&amp;amp;gt;"&amp;gt;&amp;lt;span id="MathJax-Span-41" class="math"&amp;gt;&amp;lt;span id="MathJax-Span-42" class="mrow"&amp;gt;&amp;lt;span id="MathJax-Span-43" class="mn"&amp;gt;3&amp;lt;span id="MathJax-Span-44" class="mo"&amp;gt;&amp;amp;times;&amp;lt;span id="MathJax-Span-45" class="mn"&amp;gt;3&amp;amp;nbsp;的巧克力。
当然小朋友们都希望得到的巧克力尽可能大,你能帮小明计算出最大的边长是多少么?
输入格式
第一行包含两个整数 N&amp;amp;nbsp;和&amp;amp;nbsp;&amp;lt;span id="MathJax-Element-13-Frame" class="MathJax" data-mathml="&amp;amp;lt;math xmlns=&amp;amp;quot;http://www.w3.org/1998/Math/MathML&amp;amp;quot;&amp;amp;gt;&amp;amp;lt;mi&amp;amp;gt;K&amp;amp;lt;/mi&amp;amp;gt;&amp;amp;lt;/math&amp;amp;gt;"&amp;gt;&amp;lt;span id="MathJax-Span-49" class="math"&amp;gt;K。
以下 N行每行包含两个整数&amp;amp;nbsp;&amp;lt;span id="MathJax-Element-15-Frame" class="MathJax" data-mathml="&amp;amp;lt;math xmlns=&amp;amp;quot;http://www.w3.org/1998/Math/MathML&amp;amp;quot;&amp;amp;gt;&amp;amp;lt;msub&amp;amp;gt;&amp;amp;lt;mi&amp;amp;gt;H&amp;amp;lt;/mi&amp;amp;gt;&amp;amp;lt;mi&amp;amp;gt;i&amp;amp;lt;/mi&amp;amp;gt;&amp;amp;lt;/msub&amp;amp;gt;&amp;amp;lt;/math&amp;amp;gt;"&amp;gt;&amp;lt;span id="MathJax-Span-55" class="math"&amp;gt;&amp;lt;span id="MathJax-Span-56" class="mrow"&amp;gt;&amp;lt;span id="MathJax-Span-57" class="msubsup"&amp;gt;&amp;lt;span id="MathJax-Span-58" class="mi"&amp;gt;H&amp;lt;span id="MathJax-Span-59" class="mi"&amp;gt;i&amp;amp;nbsp;和&amp;amp;nbsp;&amp;lt;span id="MathJax-Element-16-Frame" class="MathJax" data-mathml="&amp;amp;lt;math xmlns=&amp;amp;quot;http://www.w3.org/1998/Math/MathML&amp;amp;quot;&amp;amp;gt;&amp;amp;lt;msub&amp;amp;gt;&amp;amp;lt;mi&amp;amp;gt;W&amp;amp;lt;/mi&amp;amp;gt;&amp;amp;lt;mi&amp;amp;gt;i&amp;amp;lt;/mi&amp;amp;gt;&amp;amp;lt;/msub&amp;amp;gt;&amp;amp;lt;/math&amp;amp;gt;"&amp;gt;&amp;lt;span id="MathJax-Span-60" class="math"&amp;gt;&amp;lt;span id="MathJax-Span-61" class="mrow"&amp;gt;&amp;lt;span id="MathJax-Span-62" class="msubsup"&amp;gt;&amp;lt;span id="MathJax-Span-63" class="mi"&amp;gt;W&amp;lt;span id="MathJax-Span-64" class="mi"&amp;gt;i。
输入保证每位小朋友至少能获得一块 &amp;lt;span id="MathJax-Span-66" class="mrow"&amp;gt;&amp;lt;span id="MathJax-Span-67" class="mn"&amp;gt;1&amp;lt;span id="MathJax-Span-68" class="mo"&amp;gt;&amp;amp;times;&amp;lt;span id="MathJax-Span-69" class="mn"&amp;gt;1&amp;amp;nbsp;的巧克力。
输出格式
输出切出的正方形巧克力最大可能的边长。
数据范围
&amp;lt;span id="MathJax-Span-71" class="mrow"&amp;gt;&amp;lt;span id="MathJax-Span-72" class="mn"&amp;gt;1&amp;lt;span id="MathJax-Span-73" class="mo"&amp;gt;&amp;amp;le;&amp;lt;span id="MathJax-Span-74" class="mi"&amp;gt;N&amp;lt;span id="MathJax-Span-75" class="mo"&amp;gt;,&amp;lt;span id="MathJax-Span-76" class="mi"&amp;gt;K&amp;lt;span id="MathJax-Span-77" class="mo"&amp;gt;&amp;amp;le;&amp;lt;span id="MathJax-Span-78" class="msubsup"&amp;gt;&amp;lt;span id="MathJax-Span-79" class="mn"&amp;gt;10&amp;lt;sup&amp;gt;&amp;lt;span id="MathJax-Span-80" class="mn"&amp;gt;5
&amp;lt;span id="MathJax-Span-82" class="mrow"&amp;gt;&amp;lt;span id="MathJax-Span-83" class="mn"&amp;gt;1&amp;lt;span id="MathJax-Span-84" class="mo"&amp;gt;&amp;amp;le;&amp;lt;span id="MathJax-Span-85" class="msubsup"&amp;gt;&amp;lt;span id="MathJax-Span-86" class="mi"&amp;gt;H&amp;lt;span id="MathJax-Span-87" class="mi"&amp;gt;i&amp;lt;span id="MathJax-Span-88" class="mo"&amp;gt;,&amp;lt;span id="MathJax-Span-89" class="msubsup"&amp;gt;&amp;lt;span id="MathJax-Span-90" class="mi"&amp;gt;W&amp;lt;span id="MathJax-Span-91" class="mi"&amp;gt;i&amp;lt;span id="MathJax-Span-92" class="mo"&amp;gt;&amp;amp;le;&amp;lt;span id="MathJax-Span-93" class="msubsup"&amp;gt;&amp;lt;span id="MathJax-Span-94" class="mn"&amp;gt;10&amp;lt;sup&amp;gt;&amp;lt;span id="MathJax-Span-95" class="mn"&amp;gt;5
输入样例:
2 10
6 5
5 6
输出样例:
2
题目解析:
首先由每一位小朋友所得巧克力边长相同-->我们要求的就是满足条件的一个值(最大边长)-->对于每一块巧克力豆花粉乘若干块这个边长的小巧克力
所以关键就是求一个值
所以很容易想到二分算法
开始进行二分操作
1.check函数
我们要满足的是巧克力分出来的个数>=小朋友数
所以需要满足的条件是for循环所有巧克力划分出来的子块数求和>=小朋友数
每一块巧克力在确定划分边长是x时能划分出(h[i]/x)*(w[i]/x)个子块
2.写左右边界
最终答案介于1~105
l=1
r=1e5
3.写while循环
while(l<r){
int mid=l+r+1>>1;//由下面的l,r变化-->确定mid上取整
if(check(mid)){
//划分块多了那么需要增加边长
l=mid;
}
else{
r=mid-1;
}
}
4.输出答案l
cout<<l;
完整代码 #include<bits/stdc++.h>
using namespace std;
int n,k;//n块巧克力,k个小朋友
const int N=1e5+6;
int h[N];//所有巧克力的长
int w[N];//所有巧克力的宽
typedef long long int ll;
bool check(int x){
ll res=0;
for(int i=0;i<n;i++){
res+=(ll)(h[i]/x)*(w[i]/x);
}
if(res>=k)return true;
return false;
}
int main(){
cin>>n>>k;
for(int i=0;i<n;i++)cin>>h[i]>>w[i];
//进行二分(先定l,r然后不断通过check函数(满足什么条件)来找到想要的值)
//巧克力边长至少为1
int l=1;
//巧克力边长最多为10的5次方
int r=1e5;
while(l<r){
int mid=l+r+1>>1;
if(check(mid)){
l=mid;
}
else r=mid-1;
}
cout<<l;
return 0;
}

浙公网安备 33010602011771号