有关CCF暑期做题整理【未完成】

没人搭理并且无聊到不想写项目的我开始整理暑假做题情况,卑微.jpg




2019-03-1  小中大

在这里插入图片描述
审题:

  • 有序
  • 可能存在重复数据
  • 求极值和中位数
  • 按从大到小顺序输出
  • 结果为分数,四舍五入保留一位小数。【注意:任意两数除以2后如果有余数,四舍五入后必为xxx.5,我是数学白痴呜呜
#include <stdio.h>
#include <queue>
#include <algorithm>
#include <iostream>
#include <math.h>
#include <string.h>
#include <string>
#include <map>
#include <set>
#include <stack>
#include<stdlib.h>
#include <vector>
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
int main()
{
    int n;
    int a[100005];
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        cin>>a[i];
    }
    int x,y,tmp=n/2;
    x=max(a[1],a[n]);
    y=min(a[1],a[n]);
    if(n%2!=0)
    {
        tmp+=1;
        tmp=a[tmp];
        printf("%d %d %d\n",x,tmp,y);
    }
    else
    {
        if(((a[tmp]+a[tmp+1])%2)!=0)
        {
            tmp=(a[tmp]+a[tmp+1])/2;
            printf("%d %.1lf %d\n",x,(double)tmp+0.5,y);
        }
        else
        {
            tmp=(a[tmp]+a[tmp+1])/2;
            printf("%d %.d %d\n",x,tmp,y);
        }
    }

}


2019-03-2  二十四点

在这里插入图片描述

审题:

  • 四个数字,范围1–9
  • 三个四则运算符
  • 每行包含一个长度为7的字符串
  • 除法为整除

看到这题就是后悔上课没认真听课,用栈来完成,数字栈和运算符栈

#include <stdio.h>
#include <queue>
#include <algorithm>
#include <iostream>
#include <math.h>
#include <string.h>
#include <string>
#include <map>
#include <set>
#include <stack>
#include<stdlib.h>
#include <vector>
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        char str[8];
        cin>>str;
        stack<int> num;
        stack<char> sign;
        int i=0;
        while(i<strlen(str))
        {
            if(str[i]>'0' && str[i]<='9')
            {
                num.push(str[i]-'0');
            }
            else
            {
                if(str[i]=='+')
                {
                    sign.push('+');
                }
                else if(str[i]=='-')  //将减法转换成加法
                {
                    num.push((str[i+1]-'0')*(-1));
                    sign.push('+');
                    i++;
                }
                else if(str[i]=='x')  //直接计算乘法
                {
                    int ans=num.top();
                    num.pop();
                    num.push(ans*(str[i+1]-'0'));
                    i++;
                }
                else if(str[i]=='/')  //直接计算除法
                {
                    int ans=num.top();
                    num.pop();
                    num.push(ans/(str[i+1]-'0'));
                    i++;
                }
            }
            i++;
        }

        while(!sign.empty())  //计算剩余的加法
        {
            int rhs=num.top();
            num.pop();
            int lhs=num.top();
            num.pop();
            sign.pop();
            num.push(lhs+rhs);
        }
        int ans=num.top();
        if(ans==24)
            printf("Yes\n");
        else
            printf("No\n");

    }

}

附送一个我第一次的数组写法(白痴笑)

int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        char s[8];
        cin>>s;
        int a[5],k=0,t=0,p=0;
        char b[4];
        for(int i=0; i<7; i++)
        {
            if(s[i]>='1'&&s[i]<='9')
            {
                a[k++]=s[i]-'0';
            }
            else
            {
                b[t++]=s[i];
            }
        }
        int sum=0;
        if(b[0]=='x')
        {
            a[1]=a[0]*a[1];
            a[0]=0;
        }
        else if(b[0]=='/')
        {
            a[1]=a[0]/a[1];
            a[0]=0;
        }

        if(b[1]=='x')
        {
            a[2]=a[1]*a[2];
            a[1]=0;
        }
        else if(b[1]=='/')
        {
            a[2]=a[1]/a[2];
            a[1]=0;
        }

        if(b[2]=='x')
        {
            a[3]=a[2]*a[3];
            a[2]=0;
        }
        else if(b[2]=='/')
        {
            a[3]=a[2]/a[3];
            a[2]=0;
        }
        if(b[0]=='-')
        {
            if(a[1]!=0)
            {
                a[1]=a[0]-a[1];
                a[0]=0;
            }
            else if(a[1]==0&&a[2]!=0)
            {
                a[2]=a[0]-a[2];
                a[0]=0;
            }
            else if(a[1]==0&&a[2]==0&&a[3]!=0)
            {
                a[3]=a[0]-a[3];
                a[0]=0;
            }
        }
        if(b[1]=='-')
        {
            if(a[2]!=0)
            {
                a[2]=a[1]-a[2];
                a[1]=0;
            }
            else if(a[2]==0&&a[3]!=0)
            {
                a[3]=a[1]-a[3];
                a[1]=0;
            }
        }
        if(b[2]=='-')
        {
              a[3]=a[2]-a[3];
              a[2]=0;
        }
         for(int i=0;i<4;i++)
        {
              sum+=a[i];
        }
        if(sum==24)
        {
              printf("Yes\n");
        }
        else
        {
              printf("No\n");
        }



    }
}




2019-03-4  消息传递接口

在这里插入图片描述

怎么说,…
参考:https://www.cnblogs.com/xidian-mao/p/10568594.html




2018-12-1   小明上学

在这里插入图片描述
审题:

  • 亮灯顺序:红->->黄->->绿
  • 倒计时的显示牌上显示的数字 l(l > 0)是指距离下一次信号灯变化的秒数。
  • k=1、2、3 时,分别表示看到了一个红灯、黄灯、绿灯
  • k=0,直接加时间
#include <stdio.h>
#include <queue>
#include <algorithm>
#include <iostream>
#include <math.h>
#include <string.h>
#include <string>
#include <map>
#include <set>
#include <stack>
#include<stdlib.h>
#include <vector>
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
int main()
{
      int r,y,g;
      int n;
      int ans=0;
      cin>>r>>y>>g;
      cin>>n;
      while(n--)
      {
            int a,b;
            cin>>a>>b;
            if(a==3)
            {
                  continue;
            }
            else if(a==1)
            {
                  ans+=b;
            }
            else if(a==2)
            {
                  ans+=b+r;
            }
            else
            {
                  ans+=b;
            }
      }
      printf("%d\n",ans);
}

2018-12-2   小明放学

在这里插入图片描述

  • 已知的是出发时刻的红绿灯状态,因此需要一个函数来处理小明到达这个红绿灯时,该红绿灯状态。
  • 注意时间相加的数量范围
  • 思路:
    https://blog.csdn.net/richenyunqi/article/details/86437886
    这位大佬的思路非常巧妙

2018-09-2   买菜

在这里插入图片描述

#include <stdio.h>
#include <queue>
#include <algorithm>
#include <iostream>
#include <math.h>
#include <string.h>
#include <string>
#include <map>
#include <set>
#include <stack>
#include<stdlib.h>
#include <vector>
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
int x[1000002];
int main()
{
      int n,a,b;
      cin>>n;
      n*=2;
      for(int i=1;i<=n;i++)
      {
            cin>>a>>b;
            for(int j=a;j<b;j++)
            {
                  x[j]++;
            }
      }
      ll ans=0;
      for(int i=0;i<=1000001;i++)
      {
            if(x[i]==2)
            {
                  ans++;
            }
      }
      printf("%lld\n",ans);
}


2018-09-1   卖菜

在这里插入图片描述

#include <stdio.h>
#include <queue>
#include <algorithm>
#include <iostream>
#include <math.h>
#include <string.h>
#include <string>
#include <map>
#include <set>
#include <stack>
#include<stdlib.h>
#include <vector>
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
int main()
{
    int n;
    int a[1100],b[1100];
    cin>>n;
    for(int i=0; i<n; i++)
    {
        cin>>a[i];
    }
    for(int i=0; i<n; i++)
    {
        if(i==0)
        {
            b[i]=((double)a[i]+(double)a[i+1])/2.0;
        }
        else if(i==n-1)
        {
            b[i]=((double)a[i]+(double)a[i-1])/2.0;
        }
        else
        {
            b[i]=(a[i]+a[i+1]+a[i-1])*1.0/3.0;
        }
    }
    for(int i=0; i<n; i++)
    {
        printf("%d ",b[i]);
    }
    printf("\n");

}

2018-03-1  跳一跳

太简单了,忘记保存代码了…

2018-03-2   碰撞的小球

int vis[1100];
int flag[1100];
int main()
{
    int n,L,t;
    cin>>n>>L>>t;
    for(int i=1; i<=n; i++)
    {
        cin>>vis[i];//位置
        flag[i]=1;//方向
    }
    while(t--)
    {
        for(int i=1; i<=n; i++)
        {
            for(int j=i+1; j<=n; j++)
            {
                if(vis[i]==vis[j])//两个小球在同一位置,方向都要改变
                {
                    if(flag[i]==1)
                    {
                        flag[i]=0;
                    }
                    else
                    {
                        flag[i]=1;
                    }
                    if(flag[j]==1)
                    {
                        flag[j]=0;
                    }
                    else
                    {
                        flag[j]=1;
                    }
                }
            }

        }
        for(int i=1; i<=n; i++)//更新位置
        {
            if(vis[i]==0)
            {
                flag[i]=1;
            }
            if(vis[i]==L)
            {
                flag[i]=0;
            }
            if(flag[i]==1)
            {
                vis[i]++;
            }
            else
            {
                vis[i]--;
            }
        }
    }
    for(int i=1; i<=n; i++)
    {
        printf("%d ",vis[i]);
    }
}

2018-09-4  再卖菜

参考博客:https://www.cnblogs.com/peichaoL/p/10467602.html
https://blog.csdn.net/imotolove/article/details/82777819

#include <stdio.h>
#include <queue>
#include <algorithm>
#include <iostream>
#include <math.h>
#include <string.h>
#include <string>
#include <map>
#include <set>
#include <stack>
#include<stdlib.h>
#include <vector>
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
int mp[4][4];
int T;
bool judge(int k)
{
    for(int i=1; i<=3; i++)
    {
        if(mp[i][1]==k&&mp[i][2]==k&&mp[i][3]==k)
            return true;
        if(mp[1][i]==k&&mp[2][i]==k&&mp[3][i]==k)
            return true;
    }
    if(mp[1][1]==k&&mp[2][2]==k&&mp[3][3]==k)
        return true;
    if(mp[1][3]==k&&mp[2][2]==k&&mp[3][1]==k)
        return true;
    return false;
}
int dfs(int k)
{
    int t=0;
    for(int i=1; i<=3; i++)
    {
        for(int j=1; j<=3; j++)
        {
            if(mp[i][j]==0)
            {
                t++;
            }
        }
    }
    if(k==1&&judge(2))
    {
        return -t-1;
    }
    if(k==2&&judge(1))
    {
        return t+1;
    }
    if(t==0)
    {
        return 0;
    }

    int AA=INF,BB=-INF;
    for(int i=1; i<=3; i++)
    {
        for(int j=1; j<=3; j++)
        {
            if(mp[i][j]==0)
            {
                mp[i][j]=k;
                if(k==1)
                {
                    BB=max(BB,dfs(2));
                }
                if(k==2)
                {
                    AA=min(AA,dfs(1));
                }
                mp[i][j]=0;
            }
        }
    }
    if(k==1)
    {
        return BB;
    }
    if(k==2)
    {
        return AA;
    }

}
int main()
{
    cin>>T;
    while(T--)
    {
        for(int i=1; i<=3; i++)
        {
            for(int j=1; j<=3; j++)
            {
                cin>>mp[i][j];
            }
        }
        int ans=dfs(1);
        printf("%d\n",ans);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值