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.等差素數列
set的用法
7.承壓計算
演算法:動態規劃(類似於數字三角形)
4.方格分割
考點:dfs
題目:取數位
考察:遞迴
#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
2.日期問題
分巧克力
二分例題:
兒童節那天有 K位小朋友到小明家做客。
小明拿出了珍藏的巧克力招待小朋友們。
小明一共有 N塊巧克力,其中第 i 塊是 Hi×Wi的方格組成的長方形。
為了公平起見,小明需要從這 N塊巧克力中切出 K塊巧克力分給小朋友們。
切出的巧克力需要滿足:
- 形狀是正方形,邊長是整數
- 大小相同
例如一塊 6×5 的巧克力可以切出 6 塊 2×2的巧克力或者 2 塊 3×3 的巧克力。
當然小朋友們都希望得到的巧克力儘可能大,你能幫小明計算出最大的邊長是多少麼?
輸入格式
第一行包含兩個整數 N 和 K。
以下 N行每行包含兩個整數 Hi 和 Wi。
輸入保證每位小朋友至少能獲得一塊 1×1 的巧克力。
輸出格式
輸出切出的正方形巧克力最大可能的邊長。
資料範圍
1≤N,K≤105
1≤Hi,Wi≤105
輸入樣例:
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;
}