目录
tips:不会写时可以用暴力法“骗分”,不在乎时间,可以得到部分分数
P8647 [蓝桥杯 2017 省 AB] 分巧克力
儿童节那天有 K 位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。
小明一共有 N 块巧克力,其中第 i 块是 Hi×Wi 的方格组成的长方形。
为了公平起见,小明需要从这 N 块巧克力中切出 K 块巧克力分给小朋友们。切出的巧克力需要满足:
-
形状是正方形,边长是整数。
-
大小相同。
例如一块 6×5 的巧克力可以切出 6 块 2×2 的巧克力或者 2 块 3×3 的巧克力。
当然小朋友们都希望得到的巧克力尽可能大,你能帮小明计算出最大的边长是多少么?
输入格式
第一行包含两个整数 N 和 K。(1≤N,K≤105)。
以下 N 行每行包含两个整数 Hi 和 Wi。(1≤Hi,Wi≤105)。
输入保证每位小朋友至少能获得一块 1×1 的巧克力。
输出格式
输出切出的正方形巧克力最大可能的边长。
输入输出样例
输入 #1 输出 #1
2 10 2 6 5 5 6
暴力枚举
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int n,k;
int h[N],w[N];
int ans;
bool check(int x)
{
int cnt=0;//当前可以分的巧克力数
for(int i=1;i<=n;i++)
cnt+=(h[i]/x)*(w[i]/x);
if(cnt>=k)
return true;
else
return false;
}
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>h[i]>>w[i];
//枚举所有的边长
for(int i=1;i<=1e5;i++)
{
if(check(i))
ans=max(ans,i);
}
cout<<ans<<endl;
return 0;
}
二分法(点击跳转)
所有小于边长ans的都能分出k块以上的巧克力:符合模版二
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int n,k;
int h[N],w[N];
int ans=-1;
bool check(int x)
{
int cnt=0;//当前可以分的巧克力数
for(int i=1;i<=n;i++)
cnt+=(h[i]/x)*(w[i]/x);
if(cnt>=k)
return true;
else
return false;
}
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>h[i]>>w[i];
//使用二分法
int l=0,r=1e5+10;
while(l<r)
{
int mid=(l+r+1)/2;
if(check(mid))
{
l=mid;ans=l;
}
else
{
r=mid-1;ans=r;
}
}
cout<<ans<<endl;
return 0;
}
P8738 [蓝桥杯 2020 国 C] 天干地支
题目描述(思维题)
古代中国使用天干地支来记录当前的年份。
天干一共有十个,分别为:甲(jiǎ)、乙(yǐ)、丙(bǐng)、丁(dīng)、戊 (wù)、己(jǐ)、庚(gēng)、辛(xīn)、壬(rén)、癸(guǐ)。
地支一共有十二个,分别为:子(zǐ)、丑(chǒu)、寅(yín)、卯(mǎo)、辰(chén)、巳(sì)、午(wǔ)、未(wèi)、申(shēn)、酉(yǒu)、戌(xū)、亥(hài)。
将天干和地支连起来,就组成了一个天干地支的年份,例如:甲子。2020 年是庚子年。
每过一年,天干和地支都会移动到下一个。例如 2021 年是辛丑年。
每过 60 年,天干会循环 6 轮,地支会循环 5 轮,所以天干地支纪年每 60年轮回一次。例如 1900 年,1960 年,2020 年都是庚子年。
给定一个公元纪年的年份,请输出这一年的天干地支年份。
输入格式
输入一行包含一个正整数,表示公元年份。
输出格式
输出一个拼音,表示天干地支的年份,天干和地支都用小写拼音表示(不表示声调),之间不要加入任何多余的字符。
输入输出样例
输入 #1 输出 #1
2020 gengzi
说明/提示
对于所有评测用例,输入的公元年份为不超过 9999 的正整数。
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int a[N],b[N];
int main()
{
//2020%10=0 -->代表第0个是geng
//2020%12=4(可以用cout输出)-->再向前数4个,则第0个是shen
int n;
cin>>n;
//字符串从0开始,最好从第0年开始搜
string t[10]={"geng","xin","ren","gui","jia","yi","bing","ding","wu","ji"};
string d[12]={"shen","you","xu","hai","zi","chou","yin","mao","chen","si","wu","wei"};
//确定第0年后取模即可
cout<<t[n%10]<<d[n%12]<<endl;
return 0;
}
P8772 [蓝桥杯 2022 省 A] 求和
4 117 1 3 6 9
由观察可知通项公式:
tips:如果不开long long就只能通过三分之一的样例,考试的时候要注意
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+10;
long long int n,ans;
long long int a[N],s[N];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
//注意i要从1开始
for(int i=1;i<=n;i++)
s[i]=s[i-1]+a[i];
for(int i=1;i<=n;i++)
ans+=a[i]*(s[n]-s[i]);
cout<<ans<<endl;
return 0;
}