A。水题。
#include <cstdio> #include <iostream> #include <cstdlib> #include <cstring> #include <string> #include<algorithm> using namespace std; int a[105]; int main() { int n,m; cin>>n>>m; for(int i=1; i<=n; ++i) cin>>a[i]; int p=0; int ans=0; for(int i=1; i<=n; ++i) { if(p<a[i]) { p=m; ans++; } p-=a[i]; } cout<<ans<<endl; return 0; }
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; if(k==0) cout<<num<<endl; else { string t=num; sort(t.begin(),t.end(),greater<int>()); int st=0; int len=num.size(); while(k) { if(num==t) break; int maxp=st; for(int i=st+1; i<min(st+k+1,len); ++i) if(num[i]>num[maxp]) maxp=i; for(int i=maxp; i>st; --i) { swap(num[i],num[i-1]); k--; } st++; } cout<<num<<endl; } return 0; }
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 a[1005]; int main() { int n; cin>>n; for(int i=1; i<=n; ++i) cin>>a[i]; int up=0,left=0,down=0,right=0; int x=0,y=0; vis[Pair(x,y)]=1; for(int i=1; i<=n; ++i) { for(int j=1; j<=a[i]; ++j) { x++; if(i&1) y++; else y--; if(i&1) vis[Pair(x,y)]=1; else vis[Pair(x,y+1)]=-1; } up=max(up,y); down=min(down,y); left=min(left,x); right=max(right,x); } for(int i=up; i>down; --i) { for(int j=left+1; j<=right; ++j) { int &u=vis[Pair(j,i)]; if(u==1) cout<<"/"; else if(u==-1) cout<<"\\"; else cout<<" "; } cout<<endl; } return 0; }
Codeforces Round #249 (Div. 2),布布扣,bubuko.com
Codeforces Round #249 (Div. 2)
原文地址:http://www.cnblogs.com/kkkwjx/p/3762669.html