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