CCF-CSP刷题库0-10
CCF-CSP刷题库0-10
模拟题
201312-1 出现次数最多的数
#include<bits/stdc++.h> #define MAX 10005 #define MOD 1000000007 using namespace std; typedef long long ll; int a[MAX]; int main() { int t,n,m,x,y,i,j,k; scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%d",&x); a[x]++; } int maxx=0,maxa=0; for(i=1;i<=10000;i++){ if(a[i]>maxx){ maxx=a[i]; maxa=i; } } printf("%d\n",maxa); return 0; }
201312-2 ISBN号码
#include<bits/stdc++.h> #define MAX 10005 #define MOD 1000000007 using namespace std; typedef long long ll; string s; int main() { int t,n,m,x,y,i,j,k; cin>>s; int c=0,ans=0; for(i=0;i<12;i++){ if('0'<=s[i]&&s[i]<='9'){ c++; ans+=(s[i]-'0')*c; } } if(ans%11==10){ if(s[12]=='X'){ printf("Right\n"); } else{ s[12]='X'; cout<<s<<endl; } } else{ if(ans%11==s[12]-'0'){ printf("Right\n"); } else{ s[12]=ans%11+'0'; cout<<s<<endl; } } return 0; }
201312-3 最大的矩形
//有坑点,矩形高度有>10000的
#include<bits/stdc++.h> #define MAX 1005 #define MOD 1000000007 using namespace std; typedef long long ll; int a[MAX]; int main() { int t,n,m,x,y,i,j,k; scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%d",&a[i]); } int ans=0; for(i=1;i<=n;i++){ int minn=a[i]; for(j=i;j<=n;j++){ minn=min(minn,a[j]); ans=max(ans,(j-i+1)*minn); } } printf("%d\n",ans); return 0; }
201312-4 有趣的数
第一次认证
201403-1 相反数
#include<bits/stdc++.h> #define MAX 1005 #define MOD 1000000007 using namespace std; typedef long long ll; int b[MAX]; int main() { int t,n,m,x,y,i,j,k; scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%d",&x); if(x<0) b[-x]++; else b[x]++; } int ans=0; for(i=1;i<=1000;i++){ if(b[i]==2) ans++; } printf("%d\n",ans); return 0; }
201403-2 窗口
//栈
#include<bits/stdc++.h> #define MAX 1005 #define MOD 1000000007 using namespace std; typedef long long ll; struct Node{ int x1,y1,x2,y2; int i; }no; stack<Node> s,s0; int main() { int t,n,m,x,y,i,j,k; scanf("%d%d",&n,&m); for(i=1;i<=n;i++){ scanf("%d%d%d%d",&no.x1,&no.y1,&no.x2,&no.y2); no.i=i; s.push(no); } while(m--){ scanf("%d%d",&x,&y); int f=0; while(s.size()){ if(s.top().x1<=x&&s.top().y1<=y&&x<=s.top().x2&&y<=s.top().y2){ f=s.top().i; no=s.top(); } s0.push(s.top()); s.pop(); if(f!=0) break; } while(s0.size()){ s.push(s0.top()); s0.pop(); } if(f==0) printf("IGNORED\n"); else{ printf("%d\n",f); s.push(no); } } return 0; }
201403-3 命令行选项
201403-4 无线网络
//bfs,用b[当前点][增设点个数]记录状态
#include<bits/stdc++.h> #define MAX 105 #define MOD 1000000007 using namespace std; typedef long long ll; struct Node{ int x,y; }a[MAX],c[MAX]; struct Node2{ int x,y,c,p; }no; queue<Node2> q; int b[MAX*2][MAX]; double dis(int x1,int y1,int x2,int y2){ return fabs(x1-x2)*fabs(x1-x2)+fabs(y1-y2)*fabs(y1-y2); } int main() { int t,n,m,x,y,i,j,k; double r; scanf("%d%d%d%lf",&n,&m,&k,&r); for(i=1;i<=n;i++){ scanf("%d%d",&a[i].x,&a[i].y); } for(i=1;i<=m;i++){ scanf("%d%d",&c[i].x,&c[i].y); } no.x=a[1].x; no.y=a[1].y; no.c=0; no.p=0; q.push(no); b[1][0]=1; int ff=0; while(q.size()){ Node2 f=q.front(); for(i=1;i<=n;i++){ if(b[i][f.c]) continue; if(dis(f.x,f.y,a[i].x,a[i].y)>r*r) continue; if(i==2){ printf("%d\n",f.p); ff=1; break; } b[i][f.c]=1; no.x=a[i].x; no.y=a[i].y; no.c=f.c; no.p=f.p+1; q.push(no); } if(ff==1) break; for(i=1;i<=m;i++){ if(f.c+1>k||b[n+i][f.c+1]) continue; if(dis(f.x,f.y,c[i].x,c[i].y)>r*r) continue; b[n+i][f.c+1]=1; no.x=c[i].x; no.y=c[i].y; no.c=f.c+1; no.p=f.p+1; q.push(no); } q.pop(); } return 0; }
第二次认证
201409-1 相邻数对
#include<bits/stdc++.h> #define MAX 1005 #define MOD 1000000007 using namespace std; typedef long long ll; int a[MAX]; int main() { int t,n,m,x,y,i,j,k; scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%d",&a[i]); } int ans=0; for(i=1;i<n;i++){ for(j=i+1;j<=n;j++){ if(abs(a[i]-a[j])==1) ans++; } } printf("%d\n",ans); return 0; }
201409-2 画图
//标记,点边处理
#include<bits/stdc++.h> #define MAX 105 #define MOD 1000000007 using namespace std; typedef long long ll; int b[MAX][MAX]; int main() { int t,n,m,x,y,i,j,k; scanf("%d",&n); int x1,y1,x2,y2; while(n--){ scanf("%d%d%d%d",&x1,&y1,&x2,&y2); for(i=x1+1;i<=x2;i++){ for(j=y1+1;j<=y2;j++){ b[i][j]=1; } } } int ans=0; for(i=1;i<=100;i++){ for(j=1;j<=100;j++){ if(b[i][j]) ans++; } } printf("%d\n",ans); return 0; }
201409-3 字符串匹配
//s.find(s0)==s.npos找不到
#include<bits/stdc++.h> #define MAX 105 #define MOD 1000000007 using namespace std; typedef long long ll; string s0,s,ss; string cg(string s){ int len=s.length(); for(int i=0;i<len;i++){ if('a'<=s[i]&&s[i]<='z') s[i]-=32; } return s; } int main() { int t,n,m,x,y,i,j,k; cin>>s0; scanf("%d%d",&n,&m); while(m--){ cin>>s; ss=s; if(n==0){ s0=cg(s0); s=cg(s); } if(s.find(s0)!=s.npos) cout<<ss<<endl; } return 0; }
201409-4 最优配餐
第三次认证
201412-1 门禁系统
#include<bits/stdc++.h> #define MAX 1005 #define MOD 1000000007 using namespace std; typedef long long ll; int b[MAX]; int main() { int t,n,m,x,y,i,j,k; scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%d",&x); if(i>1) printf(" "); printf("%d",++b[x]); } return 0; }
201412-2 Z字形扫描
//dfs斜着分成若干层处理,奇数层(横纵坐标和为偶数)正方向(顺序自左下至右上),偶数层反方向
#include<bits/stdc++.h> #define MAX 505 #define MOD 1000000007 using namespace std; typedef long long ll; int a[MAX][MAX]; vector<int> v; void dfs(int n,bool zf,int x,int y){ if(x<1||y<1||x>n||y>n) return; if(zf){ v.push_back(a[x][y]); dfs(n,zf,x-1,y+1); } else{ v.push_back(a[x][y]); dfs(n,zf,x+1,y-1); } } int main() { int t,n,m,x,y,i,j,k; scanf("%d",&n); for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ scanf("%d",&a[i][j]); } } for(i=1;i<=n;i++){ if((i+1)%2==0) dfs(n,true,i,1); else dfs(n,false,1,i); } for(i=2;i<=n;i++){ if((n+i)%2==0) dfs(n,true,n,i); else dfs(n,false,i,n); } for(i=0;i<v.size();i++){ if(i>0) printf(" "); printf("%d",v[i]); } return 0; }
201412-3 集合竞价
//开盘价一定是给出价格之一,整理排序后逆序枚举找出最大成交量
#include<bits/stdc++.h> #define MAX 5005 #define MOD 1000000007 using namespace std; typedef long long ll; struct Node2{ string s; double x;ll c; }rec[MAX]; struct Node{ double x;ll c; }buy[MAX],sell[MAX]; bool cmp(Node a,Node b){ return a.x<b.x; } int main() { int t,n,m,y,i,j,k; t=0; double x;ll c; string s0; while(cin>>s0){ rec[++t].s=s0; if(s0[0]=='c'){ scanf("%d",&y); rec[y].s="cancel"; continue; } scanf("%lf%lld",&x,&c); rec[t].x=x; rec[t].c=c; } n=m=0; for(i=1;i<=t;i++){ if(rec[i].s[0]=='c') continue; if(rec[i].s[0]=='b'){ n++; buy[n].x=rec[i].x; buy[n].c=rec[i].c; } else{ m++; sell[m].x=rec[i].x; sell[m].c=rec[i].c; } } sort(buy+1,buy+n+1,cmp); sort(sell+1,sell+m+1,cmp); ll buyc=0,sellc=0,maxx=0; int maxi=0; for(i=1;i<=m;i++){ sellc+=sell[i].c; } j=m; for(i=n;i>=1;i--){ buyc+=buy[i].c; for(;j>=1;j--){ if(sell[j].x<=buy[i].x) break; sellc-=sell[j].c; } if(min(buyc,sellc)>maxx){ maxx=min(buyc,sellc); maxi=i; } } printf("%.2f %lld\n",buy[maxi].x,maxx); return 0; }
201412-4 最优灌溉
//最小生成树
#include<bits/stdc++.h> #define MAX 100005 #define MOD 1000000007 using namespace std; typedef long long ll; struct Node{ int u,v,w; }edge[MAX]; int f[1005]; int find(int x){ return f[x]==x?x:f[x]=find(f[x]); } bool cmp(Node a,Node b){ return a.w<b.w; } int kru(int n,int m){ for(int i=1;i<=n;i++){ f[i]=i; } sort(edge+1,edge+m+1,cmp); int cnt=0,ans=0; for(int i=1;i<=m;i++){ int u=edge[i].u; int v=edge[i].v; int w=edge[i].w; int fu=find(u),fv=find(v); if(fu!=fv){ f[fv]=fu; cnt++; ans+=w; if(cnt==n-1) return ans; } } return -1; } int main() { int t,n,m,x,y,i,j,k; scanf("%d%d",&n,&m); for(i=1;i<=m;i++){ scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w); } printf("%d\n",kru(n,m)); return 0; }
第四次认证
201503-1 图像旋转
#include<bits/stdc++.h> #define MAX 1005 #define MOD 1000000007 using namespace std; typedef long long ll; int a[MAX][MAX]; int main() { int t,n,m,x,y,i,j,k; scanf("%d%d",&n,&m); for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ scanf("%d",&a[i][j]); } } for(j=m;j>=1;j--){ for(i=1;i<=n;i++){ if(i>1) printf(" "); printf("%d",a[i][j]); } printf("\n"); } return 0; }
201503-2 数字排序
#include<bits/stdc++.h> #define MAX 1005 #define MOD 1000000007 using namespace std; typedef long long ll; struct Node{ int x,c; }a[MAX]; bool cmp(Node a,Node b){ if(a.c==b.c) return a.x<b.x; return a.c>b.c; } int main() { int t,n,m,x,y,i,j,k; scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%d",&x); a[x].x=x; a[x].c++; } sort(a,a+1000+1,cmp); for(i=0;i<=1000;i++){ if(a[i].c==0) break; printf("%d %d\n",a[i].x,a[i].c); } return 0; }
201503-3 节日
//先确定每年该月1日的星期,向后推算即可
#include<bits/stdc++.h> #define MAX 1005 #define MOD 1000000007 using namespace std; typedef long long ll; int t[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31}}; bool isRun(int x){ if((x%4==0&&x%100!=0)||x%400==0) return true; return false; } int xq(int y,int m){ int ans=2; for(int i=1850;i<y;i++){ if(isRun(i)) ans+=366; else ans+=365; } for(int i=1;i<m;i++){ if(isRun(y)) ans+=t[1][i]; else ans+=t[0][i]; } return ans; } int main() { int n,m,x,y,i,j,k; int a,b,c; scanf("%d%d%d%d%d",&a,&b,&c,&x,&y); c%=7; for(i=x;i<=y;i++){ int first=xq(i,a); int f=0,cnt=0; if(isRun(i)){ for(j=0;j<t[1][a];j++){ if((first+j)%7==c) cnt++; if(cnt==b){ printf("%d/%02d/%02d\n",i,a,j+1); f=1; break; } } } else{ for(j=0;j<t[0][a];j++){ if((first+j)%7==c) cnt++; if(cnt==b){ printf("%d/%02d/%02d\n",i,a,j+1); f=1; break; } } } if(!f) printf("none\n"); } return 0; }
201503-4网络延时
//树的直径
#include<bits/stdc++.h> #define MAX 20005 #define MOD 1000000007 using namespace std; typedef long long ll; vector<int> v[MAX]; int maxi,maxx; void dfs(int pre,int x,int c){ if(c>maxx){ maxi=x; maxx=c; } for(int i=0;i<v[x].size();i++){ int to=v[x][i]; if(to==pre) continue; dfs(x,to,c+1); } } int main() { int t,n,m,x,y,i,j,k; scanf("%d%d",&n,&m); for(i=2;i<=n;i++){ scanf("%d",&x); v[i].push_back(x); v[x].push_back(i); } for(i=1;i<=m;i++){ scanf("%d",&x); v[i+n].push_back(x); v[x].push_back(i+n); } maxi=1;maxx=0; dfs(-1,1,0); dfs(-1,maxi,0); printf("%d\n",maxx); return 0; }
第五次认证
201509-1 数列分段
#include<bits/stdc++.h> #define MAX 1005 #define MOD 1000000007 using namespace std; typedef long long ll; int a[MAX]; int main() { int t,n,m,x,y,i,j,k; scanf("%d",&n); int ans=0; a[0]=-1; for(i=1;i<=n;i++){ scanf("%d",&a[i]); if(a[i-1]!=a[i]) ans++; } printf("%d\n",ans); return 0; }
201509-2 日期计算
#include<bits/stdc++.h> #define MAX 1005 #define MOD 1000000007 using namespace std; typedef long long ll; int t[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31}}; bool isRun(int x){ if((x%4==0&&x%100!=0)||x%400==0) return true; return false; } int main() { int n,m,x,y,i,j,k; scanf("%d%d",&n,&m); int ans=0; if(isRun(n)){ for(i=1;i<=12;i++){ if(ans+t[1][i]>=m){ printf("%d\n%d\n",i,m-ans); break; } ans+=t[1][i]; } } else{ for(i=1;i<=12;i++){ if(ans+t[0][i]>=m){ printf("%d\n%d\n",i,m-ans); break; } ans+=t[0][i]; } } return 0; }
201509-3 模板生成系统
//确定左右括号位置,锁定子串替换
#include<bits/stdc++.h> #define MAX 105 #define MOD 1000000007 using namespace std; typedef long long ll; string s[MAX]; map<string,string> mp; int main() { int t,n,m,x,y,i,j,k; scanf("%d%d ",&m,&n); for(i=0;i<m;i++){ getline(cin,s[i]); } string s0,pre,now; for(i=0;i<n;i++){ getline(cin,s0); int p=s0.find(" "); int l=s0.length(); pre="{{ "+s0.substr(0,p)+" }}"; now=s0.substr(p+2,l-p-3); mp[pre]=now; } for(i=0;i<m;i++){ int p=0; int l=s[i].find("{{ ",p); int r=s[i].find(" }}",p)+2; //锁定子串 string var; while(l!=s[i].npos&&r!=s[i].npos){ var=s[i].substr(l,r-l+1); if(!mp.count(var)){ //注意写法 s[i].erase(l,r-l+1); p=l; } else{ s[i].replace(l,r-l+1,mp[var]); p=l+mp[var].length(); } l=s[i].find("{{ ",p); r=s[i].find(" }}",p)+2; } cout<<s[i]<<endl; } return 0; }
201509-4 高速公路
//有向图强连通分量中任意两点可互相到达,Kosaraju利用转置图具有和原图一样的强连通分量性质,O(n+m)(Tarjan求强连通分量)
#include<bits/stdc++.h> #define MAX 10005 #define MOD 1000000007 using namespace std; typedef long long ll; vector<int> v[MAX],rv[MAX]; vector<int> qlt[MAX]; //强连通分量 stack<int> s; int b[MAX]; void dfs(int x){ //正向 b[x]=1; for(int i=0;i<v[x].size();i++){ int to=v[x][i]; if(b[to]) continue; dfs(to); } s.push(x); //点结束时间 } void rdfs(int x,int k){ //逆向 b[x]=1; qlt[k].push_back(x); for(int i=0;i<rv[x].size();i++){ int to=rv[x][i]; if(b[to]) continue; rdfs(to,k); } } int kos(int n){ //Kosaraju算法 memset(b,0,sizeof(b)); for(int i=1;i<=n;i++){ if(!b[i]) dfs(i); } memset(b,0,sizeof(b)); int c=0; while(s.size()){ //点结束时间逆序 if(!b[s.top()]) rdfs(s.top(),++c); s.pop(); } int ans=0; for(int i=1;i<=c;i++){ int x=qlt[i].size(); //每个强连通分量点的个数 ans+=x*(x-1)/2; //两两一对所有组合情况 } return ans; } int main() { int t,n,m,x,y,i,j,k; scanf("%d%d",&n,&m); for(i=1;i<=m;i++){ scanf("%d%d",&x,&y); v[x].push_back(y); rv[y].push_back(x); } printf("%d\n",kos(n)); return 0; }
第六次认证
201512-1 数位之和
#include<bits/stdc++.h> #define MAX 1005 #define MOD 1000000007 using namespace std; typedef long long ll; int main() { int t,n,m,x,y,i,j,k; scanf("%d",&n); int ans=0; while(n){ ans+=n%10; n/=10; } printf("%d\n",ans); return 0; }
201512-2 消除类游戏
#include<bits/stdc++.h> #define MAX 35 #define MOD 1000000007 using namespace std; typedef long long ll; int a[MAX][MAX]; int b[MAX][MAX]; int main() { int t,n,m,x,y,i,j,k; scanf("%d%d",&n,&m); for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ scanf("%d",&a[i][j]); } } for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ if(1<=i-1&&i+1<=n&&a[i-1][j]==a[i][j]&&a[i][j]==a[i+1][j]){ b[i][j]=1; continue; } if(1<=j-1&&j+1<=m&&a[i][j-1]==a[i][j]&&a[i][j]==a[i][j+1]){ b[i][j]=1; continue; } if(1<=i-2&&a[i][j]==a[i-1][j]&&a[i][j]==a[i-2][j]){ b[i][j]=1; continue; } if(i+2<=n&&a[i][j]==a[i+1][j]&&a[i][j]==a[i+2][j]){ b[i][j]=1; continue; } if(1<=j-2&&a[i][j]==a[i][j-1]&&a[i][j]==a[i][j-2]){ b[i][j]=1; continue; } if(j+2<=m&&a[i][j]==a[i][j+1]&&a[i][j]==a[i][j+2]){ b[i][j]=1; continue; } } } for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ if(j>1) printf(" "); if(b[i][j]) printf("0"); else printf("%d",a[i][j]); } printf("\n"); } return 0; }
201512-3 画图
//坐标系转化行列阵,(x,y) -> (n-y-1,x)
#include<bits/stdc++.h> #define MAX 105 #define MOD 1000000007 using namespace std; typedef long long ll; char a[MAX][MAX]; int t[4][2]={0,1,1,0,-1,0,0,-1}; int n,m; void dfs(int x,int y,char c){ if(x<0||y<0||x>=n||y>=m) return; if(a[x][y]=='-'||a[x][y]=='|'||a[x][y]=='+') return; if(a[x][y]==c) return; a[x][y]=c; for(int i=0;i<4;i++){ int tx=x+t[i][0]; int ty=y+t[i][1]; dfs(tx,ty,c); } } int main() { int q,x,y,i,j,k; scanf("%d%d%d",&m,&n,&q); for(i=0;i<n;i++){ for(j=0;j<m;j++){ a[i][j]='.'; } } int p,x1,y1,x2,y2; char c; while(q--){ scanf("%d",&p); if(p==0){ scanf("%d%d%d%d",&x1,&y1,&x2,&y2); y1=n-y1-1; y2=n-y2-1; if(x1==x2){ if(y1>y2){ y1^=y2; y2^=y1; y1^=y2; } for(i=y1;i<=y2;i++){ if(a[i][x1]=='-'||a[i][x1]=='+') a[i][x1]='+'; else a[i][x1]='|'; } } else{ if(x1>x2){ x1^=x2; x2^=x1; x1^=x2; } for(i=x1;i<=x2;i++){ if(a[y1][i]=='|'||a[y1][i]=='+') a[y1][i]='+'; else a[y1][i]='-'; } } } else{ scanf("%d%d %c",&x,&y,&c); dfs(n-y-1,x,c); } } for(i=0;i<n;i++){ for(j=0;j<m;j++){ printf("%c",a[i][j]); } printf("\n"); } return 0; }
201512-4 送货
//Hierholzer算法,欧拉路径充要条件,无向图需1.连通 2.存在0或2个奇数度点,若2则为起点和终点
//80分做法并查集判连通,再判断是否为半欧拉图(即存在欧拉路径),若合法用dfs搜路径(b数组标记边)结束时入栈
//100分需用栈模拟dfs将递归转化为非递归方法避免运行错误,递归本质就是栈
#include<bits/stdc++.h> #define MAX 10005 #define MOD 1000000007 using namespace std; typedef long long ll; vector<int> v[MAX]; bool b[MAX][MAX]; int f[MAX]; stack<int> s; vector<int> vv; int find(int x){ return f[x]==x?x:f[x]=find(f[x]); } void dfs(int x){ //while(s.size()) //int x=s.top(); for(int i=0;i<v[x].size();i++){ int to=v[x][i]; if(!b[x][to]){ b[x][to]=b[to][x]=1; //s.push(to); //break; dfs(to); } } // if(i==v[x].size()){ // vv.push_back(x); // s.pop(); // } vv.push_back(x); } int main() { int t,n,m,x,y,i,j,k; scanf("%d%d",&n,&m); for(i=1;i<=n;i++){ f[i]=i; } for(i=1;i<=m;i++){ scanf("%d%d",&x,&y); int fx=find(x),fy=find(y); if(fx!=fy) f[fy]=fx; v[x].push_back(y); v[y].push_back(x); } int c=0,odd=0; for(i=1;i<=n;i++){ if(find(i)==i) c++; sort(v[i].begin(),v[i].end()); if(v[i].size()&1) odd++; } if(c!=1||odd!=0&&odd!=2||odd==2&&!(v[1].size()&1)){ printf("-1\n"); } else{ //dfs(1); s.push(1); while(s.size()){ int x=s.top(); for(i=0;i<v[x].size();i++){ int to=v[x][i]; if(!b[x][to]){ b[x][to]=b[to][x]=1; s.push(to); break; } } if(i==v[x].size()){ vv.push_back(x); s.pop(); } } for(i=vv.size()-1;i>=0;i--){ if(i<vv.size()-1) printf(" "); printf("%d",vv[i]); } } return 0; }
第七次认证
201604-1 折点计数
#include<bits/stdc++.h> #define MAX 1005 #define MOD 1000000007 using namespace std; typedef long long ll; int a[MAX]; int main() { int t,n,m,x,y,i,j,k; scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%d",&a[i]); } int ans=0; for(i=2;i<n;i++){ if(a[i-1]<a[i]&&a[i]>a[i+1]||a[i-1]>a[i]&&a[i]<a[i+1]) ans++; } printf("%d\n",ans); return 0; }
201604-2 俄罗斯方块
//枚举下落情况,两图覆盖相加不超过1即为合法,90分卡点见code数据
#include<bits/stdc++.h> #define MAX 1005 #define MOD 1000000007 using namespace std; typedef long long ll; int a[20][15],b[10][10]; int main() { int t,n,m,x,y,i,j,k; for(i=1;i<=15;i++){ for(j=1;j<=10;j++){ scanf("%d",&a[i][j]); } } for(i=16;i<20;i++){ for(j=1;j<=10;j++){ a[i][j]=1; } } for(i=1;i<=4;i++){ for(j=1;j<=4;j++){ scanf("%d",&b[i][j]); } } scanf("%d",&t); int f=0; for(k=1;k<=15;k++){ for(i=1;i<=4;i++){ for(j=1;j<=4;j++){ if(a[i+k][j+t-1]+b[i][j]>1){ f=1; break; } } if(f==1) break; } if(f==1){ for(i=1;i<=4;i++){ for(j=1;j<=4;j++){ a[i+k-1][j+t-1]+=b[i][j]; } } break; } } for(i=1;i<=15;i++){ for(j=1;j<=10;j++){ if(j>1) printf(" "); printf("%d",a[i][j]); } printf("\n"); } return 0; } /* 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 */
201604-3 路径解析
201604-4 游戏
//方法1:用三维bfs,每次+1步,第三维时间上限300。方法2:用优先队列,遇障碍+2步处理回当前点。以下用1
#include<bits/stdc++.h> #define MAX 105 #define MOD 1000000007 using namespace std; typedef long long ll; struct Node{ int x,y,s; }no; queue<Node> q; int p[MAX][MAX][MAX*3]; int b[MAX][MAX][MAX*3]; int to[4][2]={1,0,0,1,-1,0,0,-1}; int main() { int t,n,m,x,y,i,j,k; scanf("%d%d%d",&n,&m,&t); while(t--){ scanf("%d%d%d%d",&x,&y,&i,&j); for(k=i;k<=j;k++){ p[x][y][k]=1; } } if(n==1&&m==1){ printf("0\n"); return 0; } no.x=1;no.y=1;no.s=0; q.push(no); int ans=0; while(q.size()){ Node f=q.front(); for(i=0;i<4;i++){ int tx=f.x+to[i][0]; int ty=f.y+to[i][1]; int ts=f.s+1; if(tx<1||ty<1||tx>n||ty>m) continue; if(p[tx][ty][ts]||b[tx][ty][ts]) continue; b[tx][ty][ts]=1; if(tx==n&&ty==m){ ans=ts; break; } no.x=tx;no.y=ty;no.s=ts; q.push(no); } if(ans>0) break; q.pop(); } printf("%d\n",ans); return 0; }
第八次认证
201609-1 最大波动
#include<bits/stdc++.h> #define MAX 1005 #define MOD 1000000007 using namespace std; typedef long long ll; int a[MAX]; int main() { int t,n,m,x,y,i,j,k; scanf("%d",&n); int ans=0; for(i=1;i<=n;i++){ scanf("%d",&a[i]); if(i>1) ans=max(ans,abs(a[i]-a[i-1])); } printf("%d\n",ans); return 0; }
201609-2 火车购票
//贪心,从前往后从左往右坐,标记每排最右边座位
#include<bits/stdc++.h> #define MAX 1005 #define MOD 1000000007 using namespace std; typedef long long ll; int a[25][10]; int b[25]; vector<int> v; int main() { int t,n,m,x,y,i,j,k; int c=0; for(i=1;i<=20;i++){ for(j=1;j<=5;j++){ a[i][j]=++c; } } scanf("%d",&t); while(t--){ scanf("%d",&n); v.clear(); int f=0; for(i=1;i<=20;i++){ if(5-b[i]>=n){ for(j=b[i]+1;j<=b[i]+n;j++){ v.push_back(a[i][j]); } b[i]+=n; f=1; break; } } if(f==0){ int ff=0; for(i=1;i<=20;i++){ if(b[i]<5){ for(j=b[i]+1;j<=5;j++){ n--; b[i]++; v.push_back(a[i][j]); if(n==0){ ff=1; break; } } if(ff==1) break; } } } for(i=0;i<v.size();i++){ if(i>0) printf(" "); printf("%d",v[i]); } printf("\n"); } return 0; }
201609-3 炉石传说
//vector模拟
#include<bits/stdc++.h> #define MAX 1005 #define MOD 1000000007 using namespace std; typedef long long ll; struct Node{ int att,hp; }no; vector<Node> v[10]; string s; int main() { int t,n,m,x,y,i,j,k; no.att=0;no.hp=30; v[0].push_back(no); v[1].push_back(no); scanf("%d",&n); t=0; while(n--){ cin>>s; if(s[0]=='s'){ scanf("%d%d%d",&x,&no.att,&no.hp); v[t%2].insert(v[t%2].begin()+x,no); } else if(s[0]=='a'){ scanf("%d%d",&x,&y); v[t%2][x].hp-=v[(t+1)%2][y].att; v[(t+1)%2][y].hp-=v[t%2][x].att; if(v[t%2][x].hp<=0){ if(x==0) break; v[t%2].erase(v[t%2].begin()+x); } if(v[(t+1)%2][y].hp<=0){ if(y==0) break; v[(t+1)%2].erase(v[(t+1)%2].begin()+y); } } else{ t++; } } if(v[1][0].hp<=0) printf("1\n"); else if(v[0][0].hp<=0) printf("-1\n"); else printf("0\n"); for(i=0;i<2;i++){ printf("%d\n",v[i][0].hp); printf("%d",v[i].size()-1); for(j=1;j<v[i].size();j++){ printf(" %d",v[i][j].hp); } printf("\n"); } return 0; }
201609-4 交通规划
//Dijkstra,铁路长度为源点到其他各点的最短路径所经过边的权和(多种方案取最小且不计重复边)
//松弛操作时记录每个点的最近前驱(保证最优),在该点加入集合时其与前驱点所连的边即为最短路径经过的边
#include<bits/stdc++.h> #define MAX 10005 #define MOD 1000000007 using namespace std; typedef long long ll; struct Node{ int v,w; }no; vector<Node> v[MAX]; int b[MAX],dis[MAX],pre[MAX]; int ans; void dij(int n,int k){ for(int i=1;i<=n;i++){ dis[i]=INT_MAX; } dis[k]=0;pre[k]=k; for(int i=1;i<=n;i++){ int minn=INT_MAX,minj; for(int j=1;j<=n;j++){ if(b[j]||dis[j]==INT_MAX) continue; if(dis[j]<minn){ minn=dis[j]; minj=j; } } b[minj]=1; ans+=dis[minj]-dis[pre[minj]]; for(int j=0;j<v[minj].size();j++){ int to=v[minj][j].v; if(b[to]) continue; if(dis[minj]+v[minj][j].w<dis[to]){ dis[to]=dis[minj]+v[minj][j].w; pre[to]=minj; } else if(dis[minj]+v[minj][j].w==dis[to]){ if(dis[to]-dis[minj]<dis[to]-dis[pre[to]]){ pre[to]=minj; } } } } } int main() { int t,n,m,x,y,z,i,j,k; scanf("%d%d",&n,&m); while(m--){ scanf("%d%d%d",&x,&y,&z); no.v=y;no.w=z; v[x].push_back(no); no.v=x; v[y].push_back(no); } ans=0; dij(n,1); printf("%d\n",ans); return 0; }
第九次认证
201612-1 中间数
//前后缀
#include<bits/stdc++.h> #define MAX 1005 #define MOD 1000000007 using namespace std; typedef long long ll; int b[MAX],pre[MAX],suf[MAX]; int main() { int t,n,m,x,y,i,j,k; scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%d",&x); b[x]++; } for(i=2;i<=1000;i++){ pre[i]=pre[i-1]+b[i-1]; } for(i=999;i>=1;i--){ suf[i]=b[i+1]+suf[i+1]; } int f=-1; for(i=1;i<=1000;i++){ if(b[i]&&pre[i]==suf[i]){ f=i; break; } } printf("%d\n",f); return 0; }
201612-2 工资计算
#include<bits/stdc++.h> #define MAX 1005 #define MOD 1000000007 using namespace std; typedef long long ll; int main() { int t,n,m,x,y,i,j,k; scanf("%d",&n); if(n<=3500) printf("%d\n",n); else for(i=3500;i<=154400;i+=100){ int A=i-3500; double tax=0; if(A<=1500) tax+=A*0.03; else{ tax+=1500*0.03; if(1500<=A&&A<=4500) tax+=(A-1500)*0.1; else{ tax+=3000*0.1; if(4500<=A&&A<=9000) tax+=(A-4500)*0.2; else{ tax+=4500*0.2; if(9000<=A&&A<=35000) tax+=(A-9000)*0.25; else{ tax+=26000*0.25; if(35000<=A&&A<=55000) tax+=(A-35000)*0.3; else{ tax+=20000*0.3; if(55000<=A&&A<=80000) tax+=(A-55000)*0.35; else{ tax+=25000*0.35; tax+=(A-80000)*0.45; } } } } } } if(i-tax==n){ printf("%d\n",i); break; } } return 0; }
201612-3 权限查询
201612-4 压缩编码
第十次认证
201703-1 分蛋糕
#include<bits/stdc++.h> #define MAX 1005 #define MOD 1000000007 using namespace std; typedef long long ll; int main() { int t,n,m,x,y,i,j,k; scanf("%d%d",&n,&k); y=0; int ans=0; for(i=1;i<=n;i++){ scanf("%d",&x); y+=x; if(y>=k){ y=0; ans++; } } if(y>0) ans++; printf("%d\n",ans); return 0; }
201703-2 学生排队
//vector处理移动(删增),先删后增顺序可同时适用向前向后移
#include<bits/stdc++.h> #define MAX 1005 #define MOD 1000000007 using namespace std; typedef long long ll; vector<int> v; int main() { int t,n,m,x,y,i,j,k; scanf("%d%d",&n,&m); for(i=1;i<=n;i++){ v.push_back(i); } vector<int>::iterator it; while(m--){ scanf("%d%d",&x,&y); for(i=0;i<n;i++){ if(v[i]==x){ it=v.begin(); v.erase(it+i); v.insert(it+i+y,x); //先删后增 break; } } } for(i=0;i<n;i++){ if(i>0) printf(" "); printf("%d",v[i]); } return 0; }
201703-3 Markdown
201703-4 地铁修建
//使最大边最小,Kruskal从最小边开始加,加到1和n连通时输出当前边
#include<bits/stdc++.h> #define MAX 100005 #define MOD 1000000007 using namespace std; typedef long long ll; struct Node{ int u,v,w; }edge[MAX*2]; int f[MAX]; bool cmp(Node a,Node b){ return a.w<b.w; } int find(int x){ return f[x]==x?x:f[x]=find(f[x]); } int kru(int n,int m){ for(int i=1;i<=n;i++){ f[i]=i; } sort(edge+1,edge+m+1,cmp); for(int i=1;i<=m;i++){ int u=edge[i].u; int v=edge[i].v; int w=edge[i].w; int fu=find(u),fv=find(v); if(fu!=fv) f[fv]=fu; if(find(1)==find(n)) return w; } return -1; } int main() { int t,n,m,x,y,i,j,k; scanf("%d%d",&n,&m); for(i=1;i<=m;i++){ scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w); } printf("%d\n",kru(n,m)); return 0; }
待更