CCF二十届的前两题来看,基本是一些语法题或者说是送分题,就是学过大学c++的就可以直接做了。
有部分涉及到STL模板库里面的内容,使用这个会简化代码,提高效率。
然后有一些模拟题,细心点还是很容易拿到满分的。
有的题目有几种解法,可以都试试,加强一下自己的思维能力,巩固好了前两题,我们就向第三题和第四题,甚至是第五题发起进攻了。(后面有些题可以用技巧骗分)
捷径博客地址
CCF
- 捷径博客地址
- 2021年4月(第二十二此)
- 2020年12月(第二十一次)
- 2020年09月(第二十次)
- 2020年06月(第十九次)
- 2019年12月(第十八次)
- 2019年09月(第十七次)
- 2019年03月(第十六次)
- 2018年12月(第十五次)
- 2018年09月(第十四次)
- 2018年03月(第十三次)
- 2017年12月(第十二次)
- 2017年09月(第十一次)
- 2017年03月(第十次)
- 2016年12月(第九次)
- 2016年09月(第八次)
- 2016年04月(第七次)
- 2015年12月(第六次)
- 2015年09月(第五次)
- 2015年03月(第四次)
- 2014年12月(第三次)
- 2014年09月(第二次)
- 2014年03月(第一次)
- 2013年12月(第零次)
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;
}