500pt:
链接:http://codeforces.com/problemset/problem/376/A
分析:水题,模拟实现一下就行,要注意的是支点左右的和要用long long 来做,不然会错
代码:
#include <vector> #include <list> #include <map> #include <set> #include <deque> #include <queue> #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> #include <string.h> using namespace std; int main() { string s; while(cin>>s) { vector<int> left; vector<int> right; int i=0; for(;i<s.length();i++) { char c = s[i]; if(c=='=') left.push_back(0); else if(c=='^') break; else left.push_back(c-'0'); } i++; for(;i<s.length();i++) { char c = s[i]; if(c=='=') right.push_back(0); else right.push_back(c-'0'); } long long leftTotal = 0; long long rightTotal = 0; for(int i=0;i<left.size();i++) { leftTotal+=left[i]*(left.size()-i); } for(int i=0;i<right.size();i++) { rightTotal+=right[i]*(i+1); } if(leftTotal==rightTotal) cout<<"balance"<<endl; else if(leftTotal<rightTotal) cout<<"right"<<endl; else cout<<"left"<<endl; } return 0; }
1000pt:
链接:http://codeforces.com/problemset/problem/376/B
分析:开一个数组记录,如A owe B 5,那么arr[A]-=5,arr[B]+=5,最后把正的加起来的就行
代码:
#include <vector> #include <list> #include <map> #include <set> #include <deque> #include <queue> #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> #include <string.h> using namespace std; int person[110]; int main() { int n,m; while(cin>>n>>m) { memset(person,0,sizeof(person)); int a,b,c; for(int i=0;i<m;i++) { cin>>a>>b>>c; person[a]-=c; person[b]+=c; } int ret = 0; for(int i=1;i<=n;i++) { if(person[i]>=0) ret+=person[i]; } cout<<ret<<endl; } return 0; }
1500pt:
链接:http://codeforces.com/problemset/problem/375/A
分析:要注意1689怎么搭配都能凑齐余数0-6,故不管其他怎么搭配,把1689放到最后4为,一定能被7整除
代码:
#include <vector> #include <list> #include <map> #include <set> #include <deque> #include <queue> #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> #include <string.h> using namespace std; string last = "1689"; int main() { string s; cin>>s; for(int i=0;i<last.size();i++) { s.erase(find(s.begin(),s.end(),last[i])); } if(s.size()==count(s.begin(),s.end(),'0')) { cout<<"1869"<<s<<endl; return 0; } else { string sTemp; for(int i=0;i<s.size();i++) { if(s[i]!='0') { sTemp = s.substr(i,s.size()-i)+s.substr(0,i); break; } } int temp = 0; for(int i=0;i<sTemp.size();i++) { int c = sTemp[i]-'0'; temp = (temp*10+c)%7; } temp = (temp*10000)%7; do { int ret = 0; for(int i=0;i<last.size();i++) { int c = last[i]-'0'; ret = (ret*10+c)%7; } if((temp+ret)%7==0) { cout<<sTemp<<last<<endl; return 0; } }while(next_permutation(last.begin(),last.end())); } return 0; }
2000pt:
链接:http://codeforces.com/problemset/problem/376/D
分析:因为任意行都可以换,故应该采用动态规划。记录到每个点从左到右或者从右到做最多连续多少个1.在对矩阵中的每一列做处理,对单独一列进行排序,可得到那一列位置最大连续矩阵的大小,遍历每一列就可以得整个矩阵的最大连续矩阵了,有个点非常奇怪,输入时我用cin一直会超时,改成scanf就没事了。。。
代码:
#include <vector> #include <list> #include <map> #include <set> #include <deque> #include <queue> #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> #include <string.h> using namespace std; const int N=5010; char maps[N][N]; int dp[N][N]; int n,m; int main() { cin>>n>>m; for(int i=0;i<n;i++) scanf("%s", maps[i]); for(int i=0;i<n;i++) { dp[i][m]=0; for(int j=m-1;j>=0;j--) { dp[i][j] = maps[i][j]=='1'?dp[i][j+1]+1:0; } } int ret = 0; for(int r=0;r<m;r++) { static int a[N]; for(int i=0;i<n;i++) { a[i] =dp[i][r]; } sort(a,a+n); for(int i=0;i<n;i++) { ret = max(ret,a[i]*(n-i)); } } cout<<ret<<endl; return 0; }