Codeforces Round #231 (Div.2)

来源:互联网 发布:帮站seo 编辑:程序博客网 时间:2024/06/07 01:46

500pt:

题目链接:http://codeforces.com/problemset/problem/394/A

分析:其实就是个a+b=c的式子,要使得通过移动最多一根火柴使等式成立,那么|a+b-c|=+-2或者=0

代码:

#include <vector>#include <list>#include <map>#include <set>#include <deque>#include <stack>#include <bitset>#include <algorithm>#include <functional>#include <numeric>#include <utility>#include <sstream>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <ctime>using namespace std;typedef long long ll;const int N=100010;int arr[N];ll n;string s;int main(){    while(cin>>s)    {        int a = 0;        int b = 0;        int c = 0;        int i=0;        while(s[i]!='+')        {            a++;            i++;        }        i++;        while(s[i]!='=')        {            b++;            i++;        }        i++;        while(i<s.length())        {            c++;            i++;        }        if(abs(a+b-c)==0||abs(a+b-c)==2)        {            if(abs(a+b-c)==0)                cout<<s<<endl;            else if(a+b-c==2)            {                if(a>b)                    a--;                else                    b--;                c++;                for(int i=0;i<a;i++)                    cout<<"|";                cout<<"+";                for(int i=0;i<b;i++)                    cout<<"|";                cout<<"=";                for(int i=0;i<c;i++)                    cout<<"|";                cout<<endl;            }            else            {                a++;                c--;                for(int i=0;i<a;i++)                    cout<<"|";                cout<<"+";                for(int i=0;i<b;i++)                    cout<<"|";                cout<<"=";                for(int i=0;i<c;i++)                    cout<<"|";                cout<<endl;            }        }        else            cout<<"Impossible"<<endl;    }    return 0;}

1000pt:

题目链接:http://codeforces.com/problemset/problem/394/B

分析:这题出成B题略微有点难了,因为这个数的个数p很大,故不可能直接用int或者long long来算,故直接用string来算,那么最后一位只有1-9 9种可能性,而知道了后一位,是能够计算出前一位的,最后我们比较下首位是不是也满足x倍就行

代码:

#include <vector>#include <list>#include <map>#include <set>#include <deque>#include <stack>#include <bitset>#include <algorithm>#include <functional>#include <numeric>#include <utility>#include <sstream>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <ctime>using namespace std;typedef long long ll;const int N=100010;int arr[N];ll n;int p,x;string s;int main(){    while(cin>>p>>x)    {        string ret = "";                for(int i=1;i<10;i++)        {            string s(p,' ');            char c = i+'0';            s[p-1]=c;            int jinwei = 0;            for(int j=p-1;j>0;j--)            {                int t = (s[j]-'0')*x+jinwei;                int t1 = t%10;                jinwei = t/10;                char c1 = t1+'0';                s[j-1] = c1;            }            if((s[0]-'0')*x+jinwei==i&&s[0]!='0')            {                if(ret=="")                    ret = s;                else                {                    if(s<ret)                        ret = s;                }            }        }        if(ret=="")            cout<<"Impossible"<<endl;        else            cout<<ret<<endl;    }    return 0;}

1500pt:

链接:http://codeforces.com/problemset/problem/394/C

分析:题目有点难看懂,其实就是有“00”,“01”,“10”,“11”这几个东西,让你随便排列,使得列中1的总数的最大值最小。使用贪心即可,先进行排序,先放“11”,在放“10”“01”,最后放“00”,偶数行从左到右放,技术行从右往左放,注意“10”和“01”其实等价,因为可以180度翻转。

代码:

#include <vector>#include <list>#include <map>#include <set>#include <deque>#include <stack>#include <bitset>#include <algorithm>#include <functional>#include <numeric>#include <utility>#include <sstream>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <ctime>using namespace std;typedef long long ll;const int N=1010;//int arr[N];string arr[N][N];int n,m;bool cmp1(string s1,string s2){return s1<s2;}bool cmp2(string s1,string s2){return s1>s2;}int main(){while(cin>>n>>m){vector<vector<string> > v(n,vector<string>(m,""));vector<string> v1;for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>v[i][j];v1.push_back(v[i][j]);}}sort(v1.begin(),v1.end(),cmp2);int k = 0;for(int i=0;i<n;i++){if(i%2==0){for(int j=0;j<m;j++){v[i][j] = v1[k++];if(v[i][j]=="01"||v[i][j]=="10")v[i][j]="10";}}else{for(int j=m-1;j>=0;j--){v[i][j] = v1[k++];if(v[i][j]=="01"||v[i][j]=="10")v[i][j]="01";}}}for(int i=0;i<n;i++){for(int j=0;j<m;j++)cout<<v[i][j]<<" ";cout<<endl;}}return 0;}


0 0
原创粉丝点击