首页 > 代码库 > Codeforces Round #249 (Div. 2)

Codeforces Round #249 (Div. 2)

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;
}
View Code

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;
}
View Code

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;
}
View Code