寒假训练 第一个周

错误票据

 

 

这道题难在输入 ,输入挠破脑袋,我用了两个whlie进行限制

while(n--)
{
while(cin>>a[i])
{
i++;
if(cin.get()=='\n')
{
break;
}
}

#include<iostream>
#include<cstdio>
#include<algorithm>
#define N 100001
using namespace std;
int main()
{
    int n,i=0;
    cin>>n;
    int a[N];
    while(n--)
    {
        while(cin>>a[i])
        {
            i++;
            if(cin.get()=='\n')
            {
                break;
            }
        }
    }
    sort(a,a+i);
    int m,n1;
    for(int j=0;j<i-1;j++)
    {
        if(a[j]==a[j+1])
        {
            n1=a[j];
        }
        if(a[j]==a[j+1]-2)
        {
            m=a[j+1]-1;
        }
    }
    printf("%d %d\n",m,n1);
    return 0;
}

这样子限制的死死的,输入到一个一维数组中,进行简单的判断就可以了

 

 

下面是翻硬币

 

 

 

思路:直接搞两个数组作比较,然后符号不相同进行反面,直到两个数组相同为止,用数统计反面次数。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include <cstring>
#define N 1000
using namespace std;
int main()
{
  char a[N],b[N];
  int sum=0,m=0;
  cin>>a>>b;
  m=strlen(a);
  for(int i=0;i<m-1;i++)
  {
      if(a[i]!=b[i])
      {
          if(a[i+1]=='*')
          {
              a[i+1]='o';
          }
          else
          {
              a[i+1]='*';
          }
          sum++;
      }
  }
  cout<<sum;
    return 0;
}

 

 

特别数的和

 

 这个题需要分离数位,就是除以/10然后用%10

个位直接%10

十位/10后%10

百位/10/10%10后得出以此类堆

分离后比较即可

可以使用两个for进行分离如下

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
   int n,a=0;
   long long int sum=0;
   cin>>n;
   for(int i=1;i<=n;i++)
   {
       for(int j=i;j>0;j=j/10)
       {
           a=j%10;
           if (a  == 1 || a == 0 || a == 2 || a== 9)
           {
               sum=sum+i;
               break;
           }
       }
   }
   cout<<sum;
    return 0;
}

 完全二叉树

 

 

思路:把每一层相加即可,用一个一维数组,重点在于如何去访问这个一维数组达到二叉树的效果

for(int i=1;i<=n;i=i*2)
    {
        long long s=0;
        for(int j=i;j<i*2&&j<=n;j++)
        {
            s=s+a[j];
        }
        if(max<s)
        {
            max=s;
            res=be;
        }
        be++;

上面用了两个for奇妙的连接最后的res就是答案

注意,每一个二叉树的层段就是i=1;i=i*2,这就是元数个数,同时也可用这个来去访问一维数组。

带分数:

 

 该题利用暴力枚举一一列举即可

for循环一个一个找

x=x*10+下一个数值,一个一个排位

再利用函数

next_permutation进行数字排列
#include<iostream>
#include<cstdio>
#include<algorithm>
#include <cstring>
#include<cmath>
using namespace std;
int a[9]={1,2,3,4,5,6,7,8,9};
int work(int x,int y)
{
    int sum=0;
    for(int i=x;i<=y;i++)
    {
        sum=sum*10+a[i];
    }
    return sum;
}
int main()
{
    int n;
    cin>>n;
    int ans=0;
    do
    {
        for(int i=0;i<7;i++)
        {
            int b=work(0,i);
            if(b>n)
                break;
            for(int j=i+1;j<8;j++)
            {
                int c=work(i+1,j);
                int d=work(j+1,8);
                if(c%d==0&&b+c/d==n)
                {
                    ans++;
                }
            }
        }
    }while(next_permutation(a,a+9));
    cout<<ans;
    return 0;
}

英文题

E. Challenging Valleys

 

题意:就是不能让数下降两次,上升后不能在下降

坑:::按照正常思路写会无法通过一至下降的例子,所以要加限制条件

#include<iostream>
#include<cstdio>
#include<algorithm>
#include <cstring>
#include<cmath>
int a[1000010];
using namespace std;
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        int b;
        cin>>b;
        for(int i=1;i<=b;i++)
        {
            cin>>a[i];
        }
        long int f=0;
        for(int i=1;i<b;i++)
        {
            if(a[i]<a[i+1])
            {
               f=i;
                break;
            }
        }
        long int p=0;
        for(int j=f;j<b;j++)
        {
            if(a[j]>a[j+1])
            {
               p=1;
            }
            }
        if(p==1&&f!=0)
        {
            cout<<"NO"<<endl;
        }
       else
        {
            cout<<"YES"<<endl;
        }
    }
    return 0;
}

 

posted @ 2023-01-08 19:11  whatdo+  阅读(41)  评论(0编辑  收藏  举报