蓝桥杯2013年第四届真题-带分数": https://www.dotcpp.com/oj/contest4607_problem3.html
题目思路:用全排列计算出这些数字的排列情况,接着把排列出来的数字分成三段:整数,分子,分母进行计算各自的范围,然根据题目的意思进行计算。
代码如下:
#include
using namespace std;
int a[]={0,1,2,3,4,5,6,7,8,9};
int sum=0,n;
int numd(int x,int y)
{
int num=0;
for(int i=x;i<=y;i++){
num=num*10+a[i];//用来计算数值
}
return num;
}
void solve(int a[])
{
for(int i=1;i<=7;i++)//注意:整数位最大为7
{
int zs=numd(1,i);//给整数赋值
for(int j=(9-i)/2+i;j<=9;j++)
{
int fz=numd(i+1,j-1);
int fm=numd(j,9);//对分子,分母赋值
if(zs+fz/fm==n&&fz%fm==0)//根据题目要求进行判断
{
sum++;
}
}
}
}
int main()
{
cin>>n;
do{
solve(a);
}while(next_permutation(a+1,a+10));//STL的全排列函数
cout<
蓝桥杯2013年第四届真题-错误票据:https://www.dotcpp.com/oj/contest4607_problem4.html
解题思路:用数组储存输入的值,然后用for循环找出题目要求的数值;
#include
#define hh ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)//加快输入输出速度
using namespace std;
int a[100000]={0},n;
int main()
{
hh;
cin>>n;
int k=0;
while(n--)
{
while(cin>>a[k])
{
k++;
if(cin.get()=='\n')//当输入回车键时,循环结束
break;
}
}
int as=a[0],ak=a[0];//
sort(a,a+k);//把数组进行排序
for(int i=0;i
蓝桥杯2017年第八届真题-日期问题:https://www.dotcpp.com/oj/contest4607_problem5.html
解题思路:建立结构体储存年月日,同时要判断是否为闰年,利用比较算法列出每一种可能,其中还要进行判定重复的操作,最后实现函数
#include
using namespace std;
int ans=0;
struct Data
{
int year;
int month;
int day;
}data[3];//建立结构储存 年月日
int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int is_leap_year(int year)//判断是否为闰年
{
if(year%400==0||year%4==0&&year%100!=0)
return 1;
else
return 0;
}
bool cmp(struct Data a,struct Data b)//比较算法
{
if(a.year==b.year)
{
if(a.month==b.month)
{
return a.day=60) ty+=1900;
else ty+=2000;//每个情况的值不同
if(tm>=1&&tm<=12)
{
int temp=month[tm-1];
if(is_leap_year(y)&&tm==2)
temp++;
if(td>=1&&td<=temp&&Judge(ty,tm,td,ans))//判定,赋值
{
data[ans].year=ty;
data[ans].month=tm;
data[ans].day=td;
ans++;
}
}
}
int main()
{
int a,b,c;
scanf("%d/%d/%d",&a,&b,&c);
fun(a,b,c);
fun(c,a,b);
fun(c,b,a);
sort(data,data+ans,cmp);
for(int i=0;i
蓝桥杯2017年第八届真题-分巧克力:https://www.dotcpp.com/oj/contest4607_problem6.html
解题思路:用二分法求解,当边长为mid切出的巧克力的数量大于等于k,且mid+1的边长切不出k个巧克力的时候,mid就是我们要找的答案
#include
using namespace std;
int n,k;
int h[100001],w[100001];
int main()
{
cin>>n>>k;
for(int i=0;i>h[i]>>w[i];
}
int l=1,r=10001;//双指针
int ans=0;
while(l<=r)
{
int cnt=0;
int mid=(l+r)/2;
for(int i=0;i=k){
l=mid+1;//左指针右移
ans=mid;//
}
else {
r=mid-1;//右指针左移
}
}
cout<
合并区间:https://www.dotcpp.com/oj/contest4607_problem7.html
解题思路:使用归并排序的思想比较每一种可能,利用第三方数组储存答案
#include
using namespace std;
int n,m;
int a[100055],b[100055],d[100055];
int la,ra,lb,rb;//表示 需要表示的区间范围
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
cin>>la>>ra;
for(int j=1;j<=m;j++)
cin>>b[j];
cin>>lb>>rb;
//表示最终区间的范围,因为下标的偏移量,所以每对区间相减要加1
int x=(ra-la+1)+(rb-lb+1);
int temp=0;
int i=la,j=lb;
//每一个if语句后一定要加一个continue 防止i,j超限判断 ,导致答案错误
while(i<=ra||j<=rb)//这里主要运用了归并排序的知识点
{
if(i>ra&&j<=rb)//当第一个数组的范围结束且第二个范围没有结束时
{
d[temp++]=2;
j++;
continue;
}
if(j>rb&&i<=ra)//当第二个数组的范围结束且第一个范围没有结束时
{
d[temp++]=1;
i++;
continue;
}
if(a[i]b[j])
{
d[temp++]=2;
j++;
continue;
}
}
for(int i=0;i