A。水题。
#include <cstdio> #include <iostream> #include <cstdlib> #include <cstring> #include <string> #include<algorithm> using namespace std; ]; int main() { int n,m; cin>>n>>m; ; i<=n; ++i) cin>>a[i]; ; ; ; i<=n; ++i) { if(p<a[i]) { p=m; ans++; } p-=a[i]; } cout<<ans<<endl; ; }
B。用字符串读入数字。对于这个数字,从左往右看,寻找交换k次之内可得的最大数字,并交换到最左边。k再减去交换步数。如此直到k为0或者该数字达它可取的最大值。
#include <cstdio> #include <iostream> #include <cstdlib> #include <cstring> #include <string> #include<algorithm> using namespace std; string num; int k; int main() { cin>>num>>k; ) cout<<num<<endl; else { string t=num; sort(t.begin(),t.end(),greater<int>()); ; int len=num.size(); while(k) { if(num==t) break; int maxp=st; ; i<min(st+k+,len); ++i) if(num[i]>num[maxp]) maxp=i; for(int i=maxp; i>st; --i) { swap(num[i],num[i-]); k--; } st++; } cout<<num<<endl; } ; }
C。根据计算出的数字对,画一个图。
首先计算出所有的数字对,由于有负数,为了方便可以用map<int,int>来存图。取得点可能的上下左右边界值,再遍历该空间,画图即可。
#include <iostream> #include <cstdlib> #include <cstring> #include <string> #include<algorithm> #include<map> using namespace std; typedef pair<int,int> Pair; map<Pair,int > vis; ]; int main() { int n; cin>>n; ; i<=n; ++i) cin>>a[i]; ,left=,down=,right=; ,y=; vis[Pair(x,y)]=; ; i<=n; ++i) { ; j<=a[i]; ++j) { x++; ) y++; else y--; ) vis[Pair(x,y)]=; else vis[Pair(x,y+)]=-; } up=max(up,y); down=min(down,y); left=min(left,x); right=max(right,x); } for(int i=up; i>down; --i) { ; j<=right; ++j) { int &u=vis[Pair(j,i)]; ) cout<<"/"; ) cout<<"\\"; else cout<<" "; } cout<<endl; } ; }
D。预处理+统计。
统计三角形个数。要求选定的三角形的边上不含有黑点。
明显这样图中的三角形只能是等腰直角三角形。我们可以预处理出两条对角线上的白点个数。然后枚举一个点,再递增边长,在保证两条等边不含黑点的前提下,通过判断第三条边上的白点个数来判断第三条边上是否含有黑点。
这样的三角形一共有八种。第一类是斜边在对角线上的三角形,可以枚举直角点,再递增边,判断斜边。第二类是斜边在行或列上的三角形,这样可以枚举斜边中点,沿中点递增边,然后判断两条直角边。
#include <iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> using namespace std; ][]; ][]; ][],UR[][]; int main() { int n,m; scanf("%d%d",&n,&m); ; i<=n; ++i) { scanf(); ; j<=m; ++j) mp[i][j]=(grid[i][j]==:; } ; i<=n; ++i) ; j<=m; ++j) UL[i][j]=UL[i-][j-]+mp[i][j]; ; i<=n; ++i) ; --j) UR[i][j]=UR[i-][j+]+mp[i][j]; ; ; i<=n; ++i) ; j<=m; ++j) if(mp[i][j]) { ; mp[i-d][j]&&mp[i][j-d]; ++d) //左上 ][j+]==d+) ans++; ; mp[i+d][j]&&mp[i][j+d]; ++d)//右下 ][j+d+]==d+) ans++; ; mp[i-d][j]&&mp[i][j+d]; ++d)//右上 ][j-]==d+) ans++; ; mp[i+d][j]&&mp[i][j-d]; ++d)//左下 ][j-d-]==d+) ans++; ; mp[i-d][j]&&mp[i+d][j]; ++d) //左 ][j+]==d+&&UL[i+d][j]-UL[i-][j-d-]==d+) ans++; ; mp[i+d][j]&&mp[i-d][j]; ++d)//右 ][j-]==d+&&UR[i+d][j]-UR[i-][j+d+]==d+) ans++; ; mp[i][j-d]&&mp[i][j+d]; ++d) //上 ][j+]==d+&&UL[i][j+d]-UL[i-d-][j-]==d+) ans++; ; mp[i][j+d]&&mp[i][j-d]; ++d)//下 ][j+d+]==d+&&UL[i+d][j]-UL[i-][j-d-]==d+) ans++; } printf("%d\n",ans); ; }
E。找规律+构造。
答案大致有这么几种情况:
第一类:
1212
3434
1212
3434
或者
1232
3414
1232
1414等等
这类的特点是以左上角的四个格为单元,不断在每列上重复得到。而在每行上,可分为第一、二行交不交换几种情况。
第二类:
1212
3434
2121
3434
或者
1212
3434
2121
4343等等
这类的特点是以左上角的四个格为单元,不断在每行上重复得到。而在每列上,可分为第一、二列交不交换几种情况。
我们需要找出所有情况判断是否和给出的矩阵匹配即可。
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #include <vector> using namespace std; ][]; int n,m; ][]; bool judge(int x,int y) { '!=arr[x][y]) return false; return true; } void output() { ; i<=n; ++i) { ; j<=m; ++j) printf("%d",arr[i][j]); printf("\n"); } } bool check1() { ; j<=; ++j) ; i<=n; ++i) { arr[i][j]=arr[i-][j]; if(!judge(i,j)) return false; } ; j<=m; ++j) { bool ok=true; arr[][j]=arr[][j-]; arr[][j]=arr[][j-]; ,j)||!judge(,j)) ok=false; ; i<=n&&ok; ++i) { arr[i][j]=arr[i-][j]; if(!judge(i,j)) ok=false; } if(ok) continue; ok=true; arr[][j]=arr[][j-]; arr[][j]=arr[][j-]; ,j)||!judge(,j)) ok=false; ; i<=n&&ok; ++i) { arr[i][j]=arr[i-][j]; if(!judge(i,j)) ok=false; } if(!ok) return false; } return true; } bool check2() { ; i<=; ++i) ; j<=m; ++j) { arr[i][j]=arr[i][j-]; if(!judge(i,j)) return false; } ; i<=n; ++i) { bool ok=true; arr[i][]=arr[i-][]; arr[i][]=arr[i-][]; )||!judge(i,)) ok=false; ; j<=m&&ok; ++j) { arr[i][j]=arr[i][j-]; if(!judge(i,j)) ok=false; } if(ok) continue; arr[i][]=arr[i-][]; arr[i][]=arr[i-][]; ok=true; )||!judge(i,)) ok=false; ; j<=m&&ok; ++j) { arr[i][j]=arr[i][j-]; if(!judge(i,j)) ok=false; } if(!ok) return false; } return true; } int main() { scanf("%d%d",&n,&m); ; i<=n; ++i) scanf(); ]= {,,,}; do { arr[][]=p[]; arr[][]=p[]; arr[][]=p[]; arr[][]=p[]; bool ok=true; ; i<=&&ok; ++i) ; j<=&&ok; ++j) if(!judge(i,j))ok=false; if(!ok) continue; if(check1()||check2()) { output(); ; } } )); puts("); ; }