现在的位置: 首页 > 综合 > 正文

Codeforces Round #221 (Div. 2)

2018年04月03日 ⁄ 综合 ⁄ 共 3654字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.