嘘~ 正在从服务器偷取页面 . . .

CCF CSP历届真题前两题(更新至2021.04)


CCF二十届的前两题来看,基本是一些语法题或者说是送分题,就是学过大学c++的就可以直接做了。
有部分涉及到STL模板库里面的内容,使用这个会简化代码,提高效率。
然后有一些模拟题,细心点还是很容易拿到满分的。
有的题目有几种解法,可以都试试,加强一下自己的思维能力,巩固好了前两题,我们就向第三题和第四题,甚至是第五题发起进攻了。(后面有些题可以用技巧骗分)

捷径博客地址

CCF经典题刷题汇总—少年,想走捷径吗?
在这里插入图片描述

@TOC

2021年4月(第二十二此)

202104-1 灰度直方图

在这里插入图片描述
在这里插入图片描述

送分题
#include<iostream>
#include<vector>
using namespace std;
int main(){
    int n,m,l;
    cin>>n>>m>>l;
    vector<int> ans(l);
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            int temp;
            cin>>temp;
            ans[temp]++; 
        }
    }
    for(int i=0;i<l;i++){
        cout<<ans[i]<<" ";
    }
    return 0;
} 

202104-2 领域均值

二维前缀和
#include<iostream>
#include<vector>
using namespace std;
#define MAX(x,y) (x>y?x:y)
#define MIN(x,y) (x<y?x:y)
vector<vector<int> > sum(601,vector<int>(601));
int n,l,r,t;
int judge(int x,int y){
    int x1=MAX(1,x-r)-1;
    int x2=MIN(n,x+r);
    int y1=MAX(1,y-r)-1;
    int y2=MIN(n,y+r);
    int all=sum[x2][y2]-sum[x2][y1]-sum[x1][y2]+sum[x1][y1];
    int num=(x2-x1)*(y2-y1);
    if(all<=num*t)
        return 1;
    else return 0;
}
int main(){
    cin>>n>>l>>r>>t;
    int temp;
    int ans=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>temp;
            sum[i][j]=temp+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
        }
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            ans+=judge(i,j);
    cout<<ans<<endl;

    return 0;
}

2020年12月(第二十一次)

202012-1 期末预测之安全指数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

送分题
#include<iostream>
using namespace std;
int main(){
    int n;
    cin>>n;
    int y=0;
    for(int i=0;i<n;i++){
        int w,score;
        cin>>w>>score;
        y+=w*score;
    }
    if(y>=0)  cout<<y;
    else      cout<<0;
    return 0; 
} 

202012-2 期末预测之最佳阈值

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

前缀和
#include<iostream>
#include<set>
#include<vector>
#include<algorithm>
#include<cstring>
#define mm(a,b) memset(a,b,sizeof(a))
using namespace std;
struct node{
    int y;
    int result;
};
bool cmp(node a,node b){
    return a.y<b.y;
}
vector<node> v;
set<int> s;
node temp;
const int N=1e5+5;
int sum[N];
int best_y,best_num;
int main(){
    mm(sum,0);
    int m;
    cin>>m;
    for(int i=0;i<m;i++){
        cin>>temp.y>>temp.result;
        v.push_back(temp);
    }
    sort(v.begin(),v.end(),cmp);
    for(int i=1;i<=m;i++){
        sum[i]=sum[i-1]+v[i-1].result;
    }
    int one,zero;
    for(int i=1;i<=m;i++){
        temp.y=v[i-1].y;
        if(s.count(temp.y)) continue;
        s.insert(temp.y);
        one=sum[m]-sum[i-1];
        zero=i-1-sum[i-1];
        temp.result=one+zero;
        if(temp.result>=best_num){
            best_y=temp.y;
            best_num=temp.result;
        } 
    }
    cout<<best_y<<endl;
    return 0; 
} 

2020年09月(第二十次)

202009-1 称检测点查询

在这里插入图片描述
在这里插入图片描述

简单模拟

注意不要掉了题目的==距离相同返回编号比较小的==

#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std; 
struct node{
    double dis;
    int num;
    int x;
    int y;
};
bool cmp(node a,node b){
    if(a.dis!=b.dis)
        return a.dis<b.dis;
    else
        return a.num<b.num;
}
int main(){
    int n,x,y;
    node t;
    vector<node> ans;
    cin>>n>>x>>y;
    for(int i=0;i<n;i++){
        cin>>t.x>>t.y;
        t.num=i+1;
        t.dis=pow(t.x-x,2)+pow(t.y-y,2);
        ans.push_back(t);
    }
    sort(ans.begin(),ans.end(),cmp);
    for(int i=0;i<3;i++){
        cout<<ans[i].num<<endl;
    }
    return 0;
}

202009-2风险人群筛查

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

简单模拟

注意每个t循环里面stay和pass最多增加一次,所有我们用到了两个标志位来完成这个,然后对于flag2的判断不要离开区域的时候判断,因为可能完成了逗留但还在区域里,也就是每次都判断一次就行了,或者结束了再额外判断一次也行!
两个思路都行的,但是前面那种更加直接,方便一些

#include<iostream>
using namespace std;
int main(){
    int n,k,t,x1,y1,x2,y2;
    cin>>n>>k>>t>>x1>>y1>>x2>>y2;
    int pass=0,stay=0;
    for(int i=0;i<n;i++){
        int flag=0,flag2=0;
        int cnt=0;
        for(int j=0;j<t;j++){
            int tx,ty;
            cin>>tx>>ty;
            if(tx>=x1&&tx<=x2&&ty>=y1&&ty<=y2){
                cnt++;
                flag=1;
            }else{
                cnt=0;
            }
            if(cnt>=k) flag2=1;
        }
        if(flag2==1)
            stay++;
        if(flag==1) 
            pass++;
    }
    cout<<pass<<endl<<stay;
    return 0;
}

2020年06月(第十九次)

202006-1 线性分类器

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1.STL-map
#include<iostream>
#include<map>
using namespace std;
map<int,int> aa;
map<int,int> bb;
int main(){
    ios::sync_with_stdio(false);
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++){
      int a,b;
      char c;
      cin>>a>>b>>c;
      if(c=='A') aa[a]=b;
      else bb[a]=b;
    }
    for(int i=0;i<m;i++){
      int a,b,c;
      cin>>a>>b>>c;
      int flag=0;
      for(map<int,int>::iterator it=aa.begin();it!=aa.end();it++){
           if(flag==0){
                if(a+it->first*b+it->second*c>0) flag=1;
                else if(a+it->first*b+it->second*c<0) flag=-1;
           }
           else{
                int temp;
                if(a+it->first*b+it->second*c>0) temp=1;
                else if(a+it->first*b+it->second*c<0) temp=-1;
                if(temp!=flag){
                    cout<<"No"<<endl;flag=3;break;
                }
            }
        }
        if(flag!=3){
           for(map<int,int>::iterator it=bb.begin();it!=bb.end();it++){
            int temp;
            if(a+it->first*b+it->second*c>0) temp=1;
            else if(a+it->first*b+it->second*c<0) temp=-1;
            if(temp+flag!=0){
                 cout<<"No"<<endl;flag=3;break;
            }
           }   
        }
        if(flag!=3) cout<<"Yes"<<endl;  
   }
   return 0;
} 
2.STL-vector+结构体
#include<iostream>
#include<vector>
using namespace std;
struct node{
    int x;
    int y;
    node(){
    }
    node(int a,int b){
         x=a;
         y=b;
    }
};
vector<node> va,vb;
int main(){
    ios::sync_with_stdio(false);
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++){
      int a,b;
      char c;
      cin>>a>>b>>c;
      if(c=='A') va.push_back(node(a,b));
      else  vb.push_back(node(a,b)); 
    }
    while(m--){
      int flag=0;
      int a,b,c;
      cin>>a>>b>>c;
      for(int i=0;i<va.size();i++){
           if(i==0){
                if(a+b*va[i].x+c*va[i].y>0) flag=1;
                else flag=-1;
            }
           else{
            int temp;
            if(a+b*va[i].x+c*va[i].y>0) temp=1;
            else temp=-1; 
            if(flag!=temp){
                cout<<"No"<<endl;flag=3;break;
            }   
            }
        }
        if(flag!=3){
          for(int i=0;i<vb.size();i++){
            int temp;
            if(a+b*vb[i].x+c*vb[i].y>0) temp=1;
            else temp=-1; 
            if(flag+temp!=0){
                cout<<"No"<<endl;flag=3;break;
            }   
           }   
        }
        if(flag!=3) cout<<"Yes"<<endl;
    }
    return 0;
}
3.结构体数组
#include<iostream>
using namespace std;
const int N=1000;
struct node{
    int x;
    int y;
    node(){
    }
    node(int a,int b){
         x=a;
         y=b;
    }
}na[N],nb[N];
int main(){
    ios::sync_with_stdio(false);
    int n,m;
    cin>>n>>m;
    int cnta=0,cntb=0;
    while(n--){
      int a,b;
      char c;
      cin>>a>>b>>c;
      if(c=='A') na[cnta]=node(a,b),cnta++;
      else nb[cntb]=node(a,b),cntb++;
    }
    while(m--){
      int a,b,c;
      cin>>a>>b>>c;
      int flag=0;
      for(int i=0;i<cnta;i++){
           if(flag==0){
                if(a+b*na[i].x+c*na[i].y>0) flag=1;
                else flag=-1;
           }
           else{
            int temp;
            if(a+b*na[i].x+c*na[i].y>0) temp=1;
            else temp=-1; 
            if(temp!=flag){
                cout<<"No"<<endl;flag=3;break;
            }   
           }
      }
      if(flag!=3){
          for(int i=0;i<cntb;i++){
            int temp;
            if(a+b*nb[i].x+c*nb[i].y>0) temp=1;
            else temp=-1; 
            if(temp+flag!=0){
                cout<<"No"<<endl;flag=3;break;
            }   
          }   
        }
        if(flag!=3) cout<<"Yes"<<endl;
    }
    return 0;
}

202006-2 稀疏向量

在这里插入图片描述
在这里插入图片描述

STL-map (这题用vector等会超时)
#include<iostream>
#include<map>
using namespace std;
int main(){
    ios::sync_with_stdio(false);
    int n,a,b;
    cin>>n>>a>>b;
    map<int,int> m;
    int pos,val;
    long long ans=0;
    for(int i=0;i<a;i++){
      cin>>pos>>val;
      m[pos]=val;
    } 
    for(int i=0;i<b;i++){
      cin>>pos>>val;
      if(m[pos]!=0) 
      ans+=(m[pos]*val);
    }
    cout<<ans<<endl;
    return 0;
}

2019年12月(第十八次)

201912-1 报数1.STL-vector

在这里插入图片描述

简单模拟
#include<iostream>
#include<cstring>
#include<algorithm>
#define mm(a,b) memset(a,b,sizeof(a))
using namespace std;
int have7(int num){
    while(num){
        if(num%10==7) return 1;
        num/=10;
    }
    return 0;
}
int main(){
    int n;
    cin>>n;
    int cnt=0,i=1;
    int num[4];
    mm(num,0);
    while(cnt<n){
        if(have7(i)||i%7==0) num[(i-1)%4]++;
      else cnt++;
        i++;
    }
    for(int i=0;i<4;i++){
        cout<<num[i]<<endl;
    } 
    return 0;
}

201912-2 回收站选址

在这里插入图片描述

普通模拟,涉及查询map比较好用
使用到结构体的map,结构体要写排序规则
#include<iostream>
#include<map>
#include<cstring>
#define mm(a,b) memset(a,b,sizeof(a))
using namespace std;
struct node{
    int x;
    int y;
    node(int a,int b){
      x=a;
      y=b;
    }
    bool operator <(const node a) const{
      if(a.x!=x) return a.x<x;
      else return a.y<y; 
    }
};
map<node,int> m;
int xway[]={0,0,1,-1};
int yway[]={1,-1,0,0};
int xx[]={1,1,-1,-1};
int yy[]={1,-1,1,-1};
int cnt[5];
bool check(node a){
    for(int i=0;i<4;i++){
      int x=a.x+xway[i];
      int y=a.y+yway[i];
      if(m.find(node(x,y))==m.end()) return false;
    }
    for(int i=0;i<4;i++){
      int x=a.x+xx[i];
      int y=a.y+yy[i];
      if(m.find(node(x,y))!=m.end()) m[a]++;
    }
    return true;
}
int main(){
    ios::sync_with_stdio(false);
    mm(cnt,0);
    int n;
    cin>>n;
    while(n--){
      int x,y;
      cin>>x>>y;
      m[node(x,y)]=0;
    }
    for(map<node,int>::iterator it=m.begin();it!=m.end();it++){
      if(check(it->first)){
          cnt[it->second]++;
      }
    }
    for(int i=0;i<5;i++) cout<<cnt[i]<<endl;
    return 0;
}

2019年09月(第十七次)

201909-1 小明种苹果

在这里插入图片描述
在这里插入图片描述

送分题
#include<iostream>
using namespace std;
int main(){
    int t=0,k,p=-1;
    int n,m;
    cin>>n>>m;
    for(int j=1;j<=n;j++){
      int a;
      cin>>a;
      int sum=0,b;
      for(int i=0;i<m;i++){
          cin>>b;
          sum-=b;
          a+=b;
      }
      if(sum>p){
          p=sum;
          k=j;
      }
      t+=a;  
    }
    cout<<t<<" "<<k<<" "<<p<<endl; 
    return 0;
}

201906-2 小明种苹果(续)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.e判定首尾相连
2.在一棵树d只能加一次
#include<iostream>
#include<cstring>
#include<algorithm>
#define mm(a,b) memset(a,b,sizeof(a))
#define ll long long
#define N 1000
using namespace std;
int main(){
    int flag[N];
    mm(flag,0);
    int n,m,a;
    int t=0,d=0,e=0;
    cin>>n;
    for(int i=0;i<n;i++){
      cin>>m;
      int sum;
      cin>>sum;
      for(int j=1;j<m;j++){
           cin>>a;
           if(a<=0) sum+=a;
           else if(a<sum){
               flag[i]=1;
               sum=a;
           }
      }
      t+=sum;
      if(flag[i]) d++;
   }
   for(int i=0;i<n;i++){
      if(flag[(i-1+n)%n]&&flag[i]&&flag[(i+1)%n]) e++;
   }
   cout<<t<<" "<<d<<" "<<e<<endl;
   return 0;
}

2019年03月(第十六次)

201903-1 小中大

在这里插入图片描述
在这里插入图片描述

1.sort()的使用
2.注意整数输出不要带.0
#clude<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define mm(a,b) memset(a,b,sizeof(a))
#define ll long long
#define maxn 100005
using namespace std;
int main(){
    int a[maxn];
    mm(a,0);
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    sort(a,a+n);
    if(n%2==1){
         cout<<a[n-1]<<" "<<a[n/2]<<" "<<a[0]<<endl;
    }
    else{
        double mid =(a[n/2-1]+a[n/2])/2.0;
        int mid2=(int)mid;
        if(mid!=mid2)
          printf("%d %.1f %d",a[n-1],mid,a[0]);
        else
         printf("%d %d %d",a[n-1],mid2,a[0]);
    }
    return 0;
}

201903-2 二十四点

在这里插入图片描述
在这里插入图片描述

1.STL-vector 注意容器每次输入前要clear()
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
vector<int> num;
vector<char> sym;
int main(){
    ios::sync_with_stdio(false); 
    int n;
    cin>>n;
    while(n--){
      string str;
      cin>>str;
      num.clear();
      sym.clear();
      for(int i=0;i<4;i++){
          num.push_back(str[i*2]-'0');
          if(i<3) sym.push_back(str[2*i+1]);
      }
      for(int i=0;i<sym.size();i++){
          if(sym[i]=='x'){
            int temp=num[i]*num[i+1];
            num.erase(num.begin()+i+1);
            num.erase(num.begin()+i);
            num.insert(num.begin()+i,temp);
            sym.erase(sym.begin()+i);
            i--;
          }
          else if(sym[i]=='/'){
            int temp=num[i]/num[i+1];
            num.erase(num.begin()+i+1);
            num.erase(num.begin()+i);
            num.insert(num.begin()+i,temp);
            sym.erase(sym.begin()+i);
            i--;    
          }
      }
        int ans=num[0];
      for(int i=0;i<sym.size();i++){
          if(sym[i]=='+') ans+=num[i+1];
          else if(sym[i]=='-') ans-=num[i+1];
      }
      if(ans==24) cout<<"Yes"<<endl;
      else   cout<<"No"<<endl;
    } 
    return 0;
}
2.数组模拟
/*
和之前k60做单片机一个思路,先找计算优先的符号,然后计算,之后进位
我在做的时候开始是想,比如乘号,把积放在第一位,第二位变成1,这样
最后做一次就不会进位了,但是如果连乘除就会有bug,最后还是计算后进位
*/
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#define mm(a,b) memset(a,b,sizeof(a))
#define ll long long
using namespace std;
const int maxn=1e3+5;
int main(){
    int n;
    cin>>n;
    while(n--){
      int k=3;
      string str;
      cin>>str;
      int num[4];
      char sym[3];
      for(int i=0;i<4;i++){
           num[i]=str[i*2]-'0';
           if(i<3)
           sym[i]=str[i*2+1];
      }
      for(int i=0;i<k;i++){
           if(sym[i]=='x'){
                num[i]=num[i]*num[i+1];
                for(int j=i+1;j<k;j++){
                    sym[j-1]=sym[j];
                     num[j]=num[j+1];
               }
                k--;i--;
           }
           else if(sym[i]=='/'){
                num[i]=num[i]/num[i+1];
            for(int j=i+1;j<k;j++){
             sym[j-1]=sym[j];
            num[j]=num[j+1];
            }
            k--;i--;
       }
   }
   int ans=num[0];
   for(int i=0;i<k;i++){
       if(sym[i]=='x') ans=ans*num[i+1];
       if(sym[i]=='/') ans=ans/num[i+1];
       if(sym[i]=='+') ans+=num[i+1];
       if(sym[i]=='-') ans-=num[i+1];
    }
   if(ans==24)
       cout<<"Yes"<<endl;
   else 
       cout<<"No"<<endl;  
   return 0;
}

2018年12月(第十五次)

201812-1 小明上学

在这里插入图片描述

送分题
/*沙雕题*/
#include<iostream>
#include<algorithm>
#include<cstring>
#define mm(a,b) memset(a,b,sizeof(a))
#define ll long long
using namespace std;
int main(){
    int time=0;
    int r,y,g;
    cin>>r>>y>>g;
    int n;
    cin>>n;
    while(n--){
      int k,t;
      cin>>k>>t;
      switch(k){
          case 0:time+=t;break;
          case 1:time+=t;break;
          case 2:time+=t+r;break;
          case 3:break;
          default:break;
      }
    }
    cout<<time<<endl;
    return 0;
}

201812-2 小明放学

在这里插入图片描述

一维数学建模(经典)
小坑:不用ll只能拿60分,t也要注意是ll
/*
这个题咋一看,比较复杂,在草稿纸上建立一个一维坐标数学模型就很好做了。
就和题目说的一样。我们需要求出加上目前总时间后的时间属于哪个灯的时间段就可以了
*/
#include<iostream>
#include<algorithm>
#include<cstring>
#define mm(a,b) memset(a,b,sizeof(a))
#define ll long long
using namespace std;
int main(){
    int r,y,g;
    ll time=0;
    cin>>r>>y>>g;
    int n;
    cin>>n;
    while(n--){
      int k;
      ll t;
      cin>>k>>t;
      if(k!=0){
          if(k==1)  t=r-t;
          if(k==2)  t=r+g+y-t;
          if(k==3)  t=r+g-t;
          t+=time;
          t%=r+g+y;
          if(t>0&&t<=r) time+=r-t;
          if(t>r+g&&t<=r+g+y) time+=r+g+y-t+r; 
         }
        else time+=t;
   }
   cout<<time<<endl;
   return 0;
}

2018年09月(第十四次)

201809-1 卖菜

在这里插入图片描述

送分题
/*沙雕题*/
#include<iostream>
#include<algorithm>
#include<cstring>
#define mm(a,b) memset(a,b,sizeof(a))
#define ll long long
using namespace std;
int main(){
    int n;
    cin>>n;
    int num[1005],ans[1005];
    mm(num,0);
    for(int i=0;i<n;i++){
      cin>>num[i];
    }
    ans[0]=(num[0]+num[1])/2;
    ans[n-1]=(num[n-2]+num[n-1])/2;
    for(int i=1;i<n-1;i++){
      ans[i]=(num[i-1]+num[i]+num[i+1])/3;
    }
    for(int i=0;i<n;i++){
      cout<<ans[i]<<" ";
    }
    return 0;
}

201809-2 买菜

在这里插入图片描述

区间交集就是所求结果
/*
买菜时间flag++,加了两次说明重合了,这个重合的时间就是聊天的时间
*/
#include<iostream>
#include<algorithm>
#include<cstring>
#define mm(a,b) memset(a,b,sizeof(a))
#define ll long long
using namespace std;
const int N=1000000;
int cnt[N+1];
int main(){
    int n;
    cin>>n;
    mm(cnt,0);
    int a,b;
    for(int i=1;i<=n*2;i++){
      cin>>a>>b;
     for(int j=a;j<b;j++)
           cnt[j]++;
    }
    int ans=0;
    for(int i=1;i<=N;i++){
      if(cnt[i]==2) ans++;
    }
    cout<<ans<<endl;
    return 0;
}

2018年03月(第十三次)

201803-1 跳一跳

在这里插入图片描述

送分题
/*沙雕题*/
#include<iostream>
#include<algorithm>
#include<cstring>
#define mm(a,b) memset(a,b,sizeof(a))
#define ll long long
using namespace std;
int main(){
    int temp,ans=0,sco=2,flag=0;
    while(cin>>temp){
      if(temp==0) break;
      if(temp==1){
          ans+=1;flag=0;
      }
      if(temp==2){
          if(flag==1) sco+=2;
          else sco=2;
          ans+=sco;
          flag=1;
       }
   }
   cout<<ans<<endl;
   return 0;
}

201803-2 碰撞的小球

在这里插入图片描述
在这里插入图片描述

类似蓝桥杯的蚂蚁题,看代码注释(经典)
/*
感觉和蓝桥杯那个蚂蚁的题目巨像,这个题目其实很妙
1.球反向,球是一样的,完全可以想象成不反向,也就是无膨胀运行
2.排序问题,又由于球不能穿过其他球,所以球的排名不会变化
3.我们使用蚂蚁思想先求出所有球的位置
4.然后用sort找到输出循序的球初试排名,然后在结果排名dui'hao'ru对号入坐
5.这种题还可以直接模拟,time++,不会就模拟,送分题
*/
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#define mm(a,b) memset(a,b,sizeof(a))
using namespace std;
const int N=100;
int a[N];
int ans[N];
int tmp[N]; 
int main(){
    map<int,int>dic;
    int n,l,t;
    cin>>n>>l>>t;
    for(int i=0;i<n;i++){
      cin>>a[i];
      tmp[i]=a[i];
      int temp=a[i]+t;
      temp%=2*l;
      if(temp>l) ans[i]=l-temp%l;
      else       ans[i]=temp;
    } 
    sort(tmp,tmp+n);
    sort(ans,ans+n);
    for(int i=0;i<n;i++){
      dic[tmp[i]]=i;
    }
    for(int i=0;i<n;i++){
      cout<<ans[dic[a[i]]]<<" ";
    }
    return 0;
}
结构体模拟
#include<iostream>
using namespace std;
const int N=100;
struct node{
    int pos;
    int dic;
}ball[N];
int main(){
    ios::sync_with_stdio(false);
    int n,l,t;
    cin>>n>>l>>t;
    for(int i=0;i<n;i++){
      cin>>ball[i].pos;
      ball[i].dic=1;
    }
    while(t--){
      for(int i=0;i<n;i++){
          if(ball[i].pos==0) ball[i].dic=1;
          else if(ball[i].pos==l) ball[i].dic=-1;
          if(ball[i].dic==1) ball[i].pos++;
          else ball[i].pos--;
          for(int j=0;j<n;j++){
            if(i!=j&&ball[i].pos==ball[j].pos){
                ball[i].dic*=-1;
                ball[j].dic*=-1;
                break;
               }
          }
        }
    }
    for(int i=0;i<n;i++) cout<<ball[i].pos<<" ";
    return 0;
}

2017年12月(第十二次)

201712-1 最小差值

在这里插入图片描述

送分题
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1000;
const int minn=10005;
int main(){
    int n;
    cin>>n;
    int ans=minn;
    int num[N]; 
    for(int i=0;i<n;i++){
      cin>>num[i];
    } 
    for(int i=0;i<n;i++){
      for(int j=i+1;j<n;j++){
           int temp=abs(num[i]-num[j]);
           if(temp<ans) ans=temp;
        }
    }
    cout<<ans<<endl;
    return 0;
}

201712-2 游戏

在这里插入图片描述

数组模拟
#include<iostream>
#include<cstring>
#define mm(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn=1000;
int main(){
    ios::sync_with_stdio(false);
    int flag[maxn+1];
    int n,k;
    cin>>n>>k;
    mm(flag,0);
    int i=1,cnt=0;
    int kill=0;
    while(1){
      if(flag[i]==0){
          cnt++;
          if(cnt%k==0||cnt%10==k){
              flag[i]=1;
              kill++;
          }
        }
      i++;
      i%=n+1;
      if(i==0) i=1;
      if(kill==n-1) break;
    }
    for(int i=1;i<=n;i++){
      if(flag[i]==0){
          cout<<i<<endl;
          break;
        }
     }
     return 0;
}
STL-vector模拟
#include<iostream>
#include<vector>
using namespace std;
vector<int> v;
int main(){
    ios::sync_with_stdio(false);
    int n,k;
    cin>>n>>k;
    for(int i=1;i<=n;i++)
      v.push_back(i);
    int cnt=0;
    while(v.size()>1){
      for(int i=0;i<v.size();i++){
          cnt++;
          if(cnt%k==0||cnt%10==k) {
            v.erase(v.begin()+i);
            i--;
          }
      }
    }
    cout<<v[0]<<endl;
    return 0;
}

2017年09月(第十一次)

201709-1 打酱油

在这里插入图片描述

暴力直接过(数据漏洞)
#include<iostream>
using namespace std;
int main(){
    int n;
    cin>>n;
    int temp1,temp2,temp3;
    temp1=n/50;
    temp2=(n-temp1*50)/30;
    temp3=(n-temp1*50-temp2*30)/10;
    cout<<temp1*7+temp2*4+temp3<<endl;
    return 0;
}
动态规划升华一下(经典)
#include<iostream>
using namespace std;
const int N=30;
int main(){
    int five=2;   //买五瓶送几瓶 
    int three=1;  //买三瓶送几瓶 
    int n;
    cin>>n;
    n/=10;
    int ans[N+1];
    for(int i=0;i<=30;i++) ans[i]=i;
    for(int i=1;i<=n;i++){
     if(i-5>=0)
          ans[i]=ans[i-5]+5+five>ans[i]?ans[i-5]+5+five:ans[i];
      if(i-3>=0)
          ans[i]=ans[i-3]+3+three>ans[i]?ans[i-3]+3+three:ans[i];
    } 
    cout<<ans[n]<<endl;
    return 0;
}

201709-2 公共钥匙盒

在这里插入图片描述

优先队列(经典)
#include<iostream>
#include<queue>
#include<cstdio>
using namespace std;
struct node{
    int num;
    char op;
    int time;
    bool operator <(node a)const{
      if(time!=a.time)
          return a.time<time;
      else if(op!=a.op)
          return a.op>op;
      else 
          return a.num<num; 
 }
};
const int N=1000;
int hook[N+1];
int main(){
    ios::sync_with_stdio(false);
    int n,k;
    int w,s,c;
    priority_queue<node> q;
    node t;
    cin>>n>>k;
    for(int i=1;i<=n;i++)
      hook[i]=i;
    for(int i=1;i<=k;i++){
        cin>>w>>s>>c;
      t.num=w;
      t.time=s;
      t.op='G';
      q.push(t);
      t.op='R';
      t.time=s+c;
      q.push(t);
    }
    while(!q.empty()){
      t=q.top();
      q.pop();
      if(t.op=='G'){
          for(int i=1;i<=n;i++){
              if(hook[i]==t.num){
                  hook[i]=0;
                  break;
              }
           }
        }
      else if(t.op=='R'){
          for(int i=1;i<=n;i++){
               if(hook[i]==0){
                   hook[i]=t.num;
                   break;
               }
          } 
        } 
   }
   for(int i=1;i<=n;i++){
       if(i!=1) cout<<" ";
       cout<<hook[i];
   }
   cout<<endl;
   return 0;
}

2017年03月(第十次)

201703-1 分蛋糕

在这里插入图片描述

送分题
#include<iostream>
#include<cstring>
#include<algorithm>
#define mm(a,b) memsef(a,b,sizeof(a))
using namespace std;
const int N=1000;
int main(){
    ios::sync_with_stdio(false);
    int n,k;
    cin>>n>>k;
    int add=0,ans=0;
    for(int i=0;i<n;i++){
      int temp;
      cin>>temp;
      add+=temp;
      if(add>=k){
          add=0;
          ans++;
      }
      if(i==n-1&&add!=0) ans++;
    }
    cout<<ans<<endl;
    return 0;
}

201703-2 学生排队

在这里插入图片描述

STL-vector模拟
#include<iostream>
#include<vector>
using namespace std;
vector<int> v;
int main(){
    ios::sync_with_stdio(false);
    int n,m;
    cin>>n>>m;
    int t;
    for(int i=0;i<n;i++){
      v.push_back(i+1);
    }
    while(m--){
      int a,b;
      cin>>a>>b;
      for(int i=0;i<n;i++){
          if(v[i]==a){
              t=v[i];
              v.erase(v.begin()+i);
              v.insert(v.begin()+i+b,t);
              break;
          }
        }
    }
    for(int i=0;i<n;i++){
      cout<<v[i]<<" ";
    }
    return 0;
}

2016年12月(第九次)

201612-1 中间数

在这里插入图片描述

lower_bound()和upper_bound()的使用
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1000;
int val[N];
int main(){
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
      cin>>val[i];
    }
    sort(val,val+n);
    int mid=val[n/2];
    int lb=lower_bound(val,val+n,mid)-val;
    int ub=upper_bound(val,val+n,mid)-val;
    if(n-ub==lb)cout<<mid<<endl;
    else cout<<-1<<endl;
    return 0; 
}

201612-2 工资计算

在这里插入图片描述

小学数学
#include<iostream>
using namespace std;
int main(){
   int t,s;
   cin>>t;
   if(t<=3500){
      s=t;
   }
   else if(t<=4955){
      s=((t-3500)/97)*100+3500;
   }else if(t<=7655){
      s=((t-4955)/90)*100+5000;
   }else if(t<=11255){
      s=((t-7655)/80)*100+8000;
   }else if(t<=30755){
      s=((t-11255)/75)*100+12500;
   }else if(t<=44755){
      s=((t-30755)/70)*100+38500;
   }else if(t<=61005){
      s=((t-44755)/65)*100+58500;
   }else{
      s=((t-61005)/55)*100+83500;
   }
   cout<<s<<endl;
   return 0; 
}

2016年09月(第八次)

201609-1 最大波动

在这里插入图片描述

送分题
#include<iostream>
#include<cstring>
#include<cmath>
#define mm(a,b) memset(a,b,sizeof(a))
using namespace std;
const int N=1000;
int main(){
    ios::sync_with_stdio(false); 
    int n;
    int max=-1;
    cin>>n;
    int num[N];
    mm(num,0);
    for(int i=0;i<n;i++){
      cin>>num[i];
      if(i>0){
          int temp=abs(num[i]-num[i-1]);
          if(temp>max) max=temp;
      }
    }
    cout<<max<<endl;
    return 0;
}

201609-2 火车购票

在这里插入图片描述

数组模拟
#include<iostream>
#include<cstring>
#include<cmath>
#define mm(a,b) memset(a,b,sizeof(a))
using namespace std;
const int N=100;
int main(){
    int n;
    int flag=0;
    int num[N+1];
    int cnt[21];
    int temp;
    for(int i=1;i<=20;i++) cnt[i]=5;
    mm(num,0);
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>temp;
     for(int j=1;j<=20;j++){
           if(cnt[j]>=temp){
               cnt[j]-=temp; 
              for(int k=(j-1)*5+1;k<j*5+1;k++){
                if(num[k]==0&&temp){
                     temp--;
                    cout<<k<<" ";
                    num[k]=1;
                } 
               }
              cout<<endl;break;
            }
            if(cnt[j]<temp&&j==20) flag=1;
       }
       if(flag==1){
          flag=0;
          for(int i=1;i<=100;i++){
              if(num[i]==0&&temp){
                  temp--;
                  num[i]=1;
                  cout<<i<<" ";
                  cnt[i/5+1]--; 
              }
           }
           cout<<endl; 
       }
   }
   return 0;
}

2016年04月(第七次)

201604-1 折点计数

在这里插入图片描述

送分题
#include<iostream>
using namespace std;
const int N=1000;
int main(){
    ios::sync_with_stdio(false);
    int n,flag,ans=0;
    cin>>n;
    int num[N];
    cin>>num[0]>>num[1];
    if(num[1]>num[0]) flag=1;
    else if(num[1]<num[0]) flag=-1;
    for(int i=2;i<n;i++){
      cin>>num[i];
      int temp;
      if(num[i]-num[i-1]>0) temp=1;
      else if(num[i]-num[i-1]<0) temp=-1;
      if(temp!=flag) {
          ans++;
          flag=temp;
      } 
    }
    cout<<ans<<endl;
    return 0;
}

201604-2 俄罗斯方块

在这里插入图片描述

在这里插入图片描述

经典模拟
#include<iostream>
using namespace std;
int main(){
    int flag=0;
    int map[15][10];
    int newmap[4][4];
    for(int i=0;i<15;i++){
      for(int j=0;j<10;j++){
           cin>>map[i][j];
      }
    }
    for(int i=0;i<4;i++){
      for(int j=0;j<4;j++){
           cin>>newmap[i][j];
      }
    }
    int n;
    cin>>n; 
    n--;
    for(int i=0;i<15;i++){
      if(flag==1||flag==2){
          for(int j=i;j<i+4;j++){
               for(int k=n;k<n+4;k++){
                if(map[j][k]==0) map[j][k]=newmap[j-i][k-n];
               }
           }
           break;
        }
      for(int j=i;j<i+4;j++){
          for(int k=n;k<n+4;k++){
            if(newmap[j-i][k-n]==1&&map[j][k]==1){
                 flag=1;break;
            }
            if(j==14&&newmap[j-i][k-n]==1){
                 flag=2;break;
            }
          }
          if(flag==1) {
              i-=2;break;
          }
          if(flag==2){
              i-=1;break;
          }
       } 
   }
   for(int i=0;i<15;i++){
      for(int j=0;j<10;j++){
           cout<<map[i][j];
           if(j!=9) cout<<" ";
      }
        cout<<endl;
   }
   return 0;
}

2015年12月(第六次)

201512-1 数位之和

在这里插入图片描述

送分题
#include<iostream>
#include<cstring>
using namespace std;
int main(){
    string str;
    cin>>str;
    int ans=0;
    for(int i=0;i<str.length();i++){
      ans+=str[i]-'0';
    }
    cout<<ans<<endl;
    return 0;
}

201512-2 消除类游戏

在这里插入图片描述
在这里插入图片描述

数组模拟,注意一个点可能被消除两次
#include<iostream>
using namespace std;
int main(){
    ios::sync_with_stdio(false);
    int map[30][30];
    int temp[30][30];
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++){
      for(int j=0;j<m;j++){
           cin>>map[i][j];
           temp[i][j]=map[i][j];
      }
    }
    int cnt;
    for(int i=0;i<n;i++){
      for(int j=0;j<m;j++){
           cnt=0;
           for(int k=j;k<m;k++){
            if(temp[i][k]==temp[i][j]) cnt++;
            else break;
           }
           if(cnt>=3){
            for(int k=j;k<j+cnt;k++){
                 map[i][k]=0;
            }
           }
        }
    } 
    for(int i=0;i<m;i++){
      for(int j=0;j<n;j++){
           cnt=0;
           for(int k=j;k<n;k++){
            if(temp[k][i]==temp[j][i]) cnt++;
            else break;
           }
           if(cnt>=3){
            for(int k=j;k<j+cnt;k++){
                 map[k][i]=0;
            }
           }
      }
    }
    for(int i=0;i<n;i++){
      for(int j=0;j<m;j++){
           cout<<map[i][j]<<" ";
      }
      cout<<endl;
    }
    return 0;
}

2015年09月(第五次)

201509-1 数列分段

在这里插入图片描述

送分题
#include<iostream>
using namespace std;
int main(){
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
    int temp1,temp2;
    cin>>temp1;
    int ans=1;
    for(int i=1;i<n;i++){
      cin>>temp2;
      if(temp2!=temp1) {
          ans++;
          temp1=temp2;
      }
    }
    cout<<ans<<endl;
    return 0;
}

201509-2 日期计算

在这里插入图片描述

注意好闰年计算和月份含多少天即可
#include<iostream>
using namespace std;
bool run(int y){
    if(y%4==0&&y%100!=0||y%400==0)
    return true;
    return false;
}
int yes[12]={31,29,31,30,31,30,31,31,30,31,30,31};
int no[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int main(){
    int y,d;
    cin>>y>>d;
    int m=0,day=0;
    if(run(y)){
      while(d){
          day++;
          d--;
          if(day>yes[m]){
            day%=yes[m];
            m++;
          }
      }
    }else{
      while(d){
          day++;
          d--;
          if(day>no[m]){
            day%=no[m];
            m++;
          }
      }  
    }
    cout<<m+1<<endl<<day<<endl;
    return 0;
}

2015年03月(第四次)

201503-1 图像旋转

在这里插入图片描述

简单模拟
#include<iostream>
using namespace std;
const int N=1000;
int ans[N][N];
int main(){
    int temp;
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++){
      for(int j=0;j<m;j++){
           cin>>temp;
           ans[m-1-j][i]=temp;
      }
    }
    for(int i=0;i<m;i++){
      for(int j=0;j<n;j++){
           cout<<ans[i][j]<<" ";
      }
        cout<<endl;
 }
 return 0;
}

201503-2 数字排序

在这里插入图片描述

结构体使用
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1000;
struct Num{
    int cnt;
    int shu;
}num[N+1];
bool cmp(Num a,Num b){
    if(a.cnt!=b.cnt)
     return a.cnt>b.cnt;
    return a.shu<b.shu;
}
int main(){
    for(int i=0;i<=N;i++){
      num[i].cnt=0;
      num[i].shu=i;
    }
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
      int temp;
      cin>>temp;
      num[temp].cnt++; 
    }
    sort(num,num+N+1,cmp);
    for(int i=0;i<=N;i++){
      if(num[i].cnt!=0)
         cout<<num[i].shu<<" "<<num[i].cnt<<endl;
      else break;
    } 
    return 0;
}

2014年12月(第三次)

201412-1 门禁系统

在这里插入图片描述

送分题
#include<iostream>
using namespace std;
const int N=1000;
int num[N+1];
int main(){
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
      int temp;
      cin>>temp;
      num[temp]++;
      cout<<num[temp]<<" ";
    }
    return 0;
}

201412-2 Z字形扫描

在这里插入图片描述

经典模拟
#include<iostream>
using namespace std;
const int N=500;
int map[N][N];
int main(){
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
      for(int j=0;j<n;j++){
           cin>>map[i][j];
      }
    }
    int a=0,b=0;
    for(int i=1;i<=n;i++){
      int cnt=i;
      while(1){
          cout<<map[a][b]<<" ";
          cnt--;
          if(cnt==0) break;
          if(i%2==1)
            a-=1,b+=1;
          else
            a+=1,b-=1; 
        }
        if(i!=n)
        if(i%2==1) b+=1; 
        else       a+=1;
    }
    if(n%2==1) a+=1;
    else b+=1;
    for(int i=n-1;i>0;i--){
      int cnt=i;
      while(1){
          cout<<map[a][b]<<" ";
          cnt--;
          if(cnt==0) break;
          if(i%2==1)
            a-=1,b+=1;
          else
            a+=1,b-=1; 
      }
      if(i%2==1) a+=1; 
      else       b+=1;
    }
    return 0;
}

2014年09月(第二次)

201409-1 相邻数对

在这里插入图片描述

暴力破解
#include<iostream>
#include<cmath>
using namespace std;
const int N=1000;
int num[N];
int main(){
    ios::sync_with_stdio(false);
    int n;
    int ans=0;
    cin>>n;
    for(int i=0;i<n;i++){
      cin>>num[i];
    }
    for(int i=0;i<n;i++){
      for(int j=i+1;j<n;j++){
          if(abs(num[j]-num[i])==1) ans++;
      }
    } 
    cout<<ans<<endl;
    return 0;
}

201409-2 画图

在这里插入图片描述

送分题
#include<iostream>
using namespace std;
const int N=100;
int map[N][N];
int main(){
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
    int cnt=0;
    int ans=0;
    for(int i=0;i<n;i++){
      int x1,x2,y1,y2;
      cin>>x1>>y1>>x2>>y2;
      ans+=(x2-x1)*(y2-y1);
     for(int i=x1;i<x2;i++){
          for(int j=y1;j<y2;j++){
            if(map[i][j]==0){
                map[i][j]=1;
            }
           else{
                cnt++;
            }
          }
        }
    }
    cout<<ans-cnt<<endl;
    return 0;
}

2014年03月(第一次)

201403-1 相反数

在这里插入图片描述

送分题,还可用STL-map来做但没必要
#include<iostream>
using namespace std;
const int N=500;
int main(){
    int n;
    cin>>n;
    int ans=0;
    int num[N];
    for(int i=0;i<n;i++){
      cin>>num[i];
    }
    for(int i=0;i<n;i++){
      for(int j=i+1;j<n;j++){
          if(num[i]+num[j]==0) ans++;
      }
    }
    cout<<ans<<endl;
}

201403-2 窗口

在这里插入图片描述

STL-vector+结构体模拟
#include<iostream>
#include<vector> 
using namespace std;
const int X=2560;
const int Y=1440;
struct Pos{
 int x1;
 int x2;
 int y1;
 int y2;
 int num;
};
int main(){
    vector<Pos> p;
    Pos t;
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
      int x1,y1,x2,y2;
      cin>>t.x1>>t.y1>>t.x2>>t.y2;
      t.num=i;
      p.push_back(t);
    }
    int k;
    for(int i=0;i<m;i++){
      int x,y;
     k=-1;
      cin>>x>>y;
        for(int i=p.size()-1;i>=0;i--){
           if(x>=p[i].x1&&x<=p[i].x2&&y>=p[i].y1&&y<=p[i].y2){
            t=p[i];
            k=p[i].num;
            p.erase(p.begin()+i);
            p.push_back(t);  
            break;
           }
        }
      if(k!=-1){
          cout<<k<<endl;
      }
      else cout<<"IGNORED"<<endl;
    } 
    return 0;
}

2013年12月(第零次)

201312-1 出现次数最多的数

在这里插入图片描述

C++

送分题
#include<iostream>
using namespace std;
const int N=10000;
int num[N+1];
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
      int temp;
      cin>>temp;
      num[temp]++;
    }
    int j=1,cnt=num[1];
    for(int i=1;i<N+1;i++){
      if(num[i]>cnt){
          cnt=num[i];j=i;
      }
    }
    cout<<j<<endl;
    return 0;
} 

Java

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
    public static void main(String[] args){
        HashMap<Integer,Integer> map=new HashMap<>();
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        for(int i=0;i<n;i++){
            int temp=sc.nextInt();
            if(map.containsKey(temp)){
                map.replace(temp,map.get(temp)+1);
            }else{
                map.put(temp,1);
            }
        }
        sc.close();
        int pnum=10000;
        Integer maxCount =Collections.max(map.values());
        for(Map.Entry<Integer,Integer> m:map.entrySet()){
            if(m.getValue()==maxCount){
                int p=m.getKey();
                if(p<pnum) pnum=p;
            }
        }
        System.out.println(pnum);
    }
}

201312-2 ISBN号码

在这里插入图片描述

送分题
#include<iostream>
#include<string>
#include<cstring> 
using namespace std;
int main(){
    int num[9];
    int ans=0;
    string str;
    cin>>str;
    num[0]=str[0]-'0';
    num[1]=str[2]-'0';
    num[2]=str[3]-'0'; 
    num[3]=str[4]-'0'; 
    num[4]=str[6]-'0'; 
    num[5]=str[7]-'0'; 
    num[6]=str[8]-'0'; 
    num[7]=str[9]-'0'; 
    num[8]=str[10]-'0';
    if(str[12]=='X') ans=10;
    else ans=str[12]-'0';
    int temp=0;
    for(int i=0;i<9;i++){
      temp+=num[i]*(i+1);
      temp%=11;
    }
    if(temp==ans) cout<<"Right"<<endl;
    else{
      for(int i=0;i<str.length()-1;i++)
          cout<<str[i];
        if(temp!=10)
        cout<<temp<<endl;
        else cout<<'X'<<endl;
   }
   return 0;
}

版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 梦想成为假面骑士的司祎同学 !
赏
评论
评论
 上一篇
matlab也能用来机器学习-手把手教你玩分类学习工具箱(ROC曲线,混淆矩阵一键生成) matlab也能用来机器学习-手把手教你玩分类学习工具箱(ROC曲线,混淆矩阵一键生成)
matlab分类学习工具箱为什么选择matlab当然python是做机器学习和深度学习的最佳方法!但这是在搭建一些新的模型,或是创新的情况下。现在很多模型都是封装好了的,我们可以直接调用。在python中有sklearn包可以帮我们剩去模型
2021-06-15
下一篇 
黑客从入门到入狱---不得不说的缓冲区溢出攻击 黑客从入门到入狱---不得不说的缓冲区溢出攻击
请同学们学到技术后不要到处伸张简单介绍:什么是缓冲区溢出攻击缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现是由于数据缓冲器和返回地址的暂时
  目录