周赛题目小结

       蓝桥杯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

你可能感兴趣的:(笔记,总结,学习)