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; }
题目链接: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; }
链接: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; }
原文:http://blog.csdn.net/wangyuquanliuli/article/details/19753085