Codeforces Round #533 (Div. 2) A(暴力)B(暴力)D(暴力搜索)

A. Salem and Sticks(暴力)

题目链接:https://codeforces.com/contest/1105/problem/A

题目大意:给你n个木棒,已知每个木棒的长度,然后你要修改一些木棒的长度使每个木棒的长度之间的差<=1,求该长度和花费。

思路:因为长度范围[1,100]所以直接枚举即可。

AC:

int arr[MAXN];

int main(){
	int n;
	while(cin>>n){
		clean(arr,0);
		for(int i=1;i<=n;++i){
			cin>>arr[i];
		}
		int ans=INF32,ansi;
		for(int i=1;i<=100;++i){
			int res=0;
			for(int j=1;j<=n;++j){
				if(abs(i-arr[j])>1)
					res+=abs(i-arr[j])-1;
			}
			if(res<ans)
				ans=res,ansi=i;
		}
		cout<<ansi<<" "<<ans<<endl;
	}
	
}

B. Zuhair and Strings(暴力)

题目链接:https://codeforces.com/contest/1105/problem/B

题目大意:给出n长度的小写字符串,问这个字符串种有多少个子串他们的k个元素相同,(不同字串不能覆盖)

思路:首先处理出每个字符的前面有多少个一样的字符,然后遍历26个字母,找出符合要求的最多的那一组。

AC:

int arr[MAXN];
int n,k;

int main(){
	while(cin>>n>>k){
		clean(arr,0);
		string s;
		cin>>s;
		arr[0]=1;
		for(int i=1;i<n;++i){
			if(s[i]==s[i-1])
				arr[i]=arr[i-1]+1;
			else
				arr[i]=1;
		}
		int ans=0;
		for(int i=0;i<26;++i){
			int res=0;
			for(int j=0;j<n;++j){
				if(arr[j]%k==0&&s[j]=='a'+i)
					res++;
			}
			ans=max(ans,res);
		}
		cout<<ans<<endl;
		
	}
	
}

D. Kilani and the Game(暴力搜索)

题目链接:https://codeforces.com/contest/1105/problem/D

题目大意:一个地图,由k个玩家,每个玩家由一定的行走速度,走过的格子就是他们的领地,直到所有人都不能走,问最后每个玩家的领地。

思路,还是搜索,只不过由了速度限制,再加个队列即可。

AC:

//#pragma comment(linker, "/STACK:1024000000,1024000000")
  
#include<stdio.h>
#include<string.h> 
#include<math.h> 
   
#include<map>  
#include<set>
#include<deque> 
#include<queue> 
#include<stack> 
#include<bitset>
#include<string> 
#include<fstream>
#include<iostream> 
#include<algorithm> 
using namespace std; 
  
#define ll long long 
#define Pair pair<int,int>
//#define max(a,b) (a)>(b)?(a):(b)
//#define min(a,b) (a)<(b)?(a):(b)
#define clean(a,b) memset(a,b,sizeof(a))// ˮӡ
//std::ios::sync_with_stdio(false);
//  register
const int MAXN=1e3+10;
const int INF32=0x3f3f3f3f;
const ll INF64=0x3f3f3f3f3f3f3f3f;
const ll mod=1e9+7;
const double PI=acos(-1.0);

struct node{
	int kind;int y,x;
	node(int _kind=0,int _y=0,int _x=0):
	kind(_kind),y(_y),x(_x){}
}arr[MAXN*MAXN];
char mp[MAXN][MAXN];
int fx[4]={0,0,-1,1},fy[4]={1,-1,0,0};
int v[10],sum[MAXN];
queue<node> que,que2,que3;
int n,m,p;

int judge(int x,int y){
	if(x<=m&&x>=1&&y<=n&&y>=1){
		if(mp[y][x]=='.'){
			return 1;
		}
	}
	return 0;
}

void bfs(){
	while(que.size()){
		node Pir=que.front();
		que.pop();que2.push(Pir);
		while(que.size()){
			if(que.front().kind==que2.front().kind){//每种玩家入队列2
				que2.push(que.front());
				que.pop();
			}
			else	break;
		}
		int cnt=v[que2.front().kind];
		while(cnt--){//走能够行动的速度次
			while(que3.size())	que3.pop();//初始化que3
			while(que2.size()){//队列2种的元素入que3
				que3.push(que2.front());
				que2.pop();
			}
			int f=1;//此处判断是否能够直接跳出
			while(que3.size()){//对que3种的每个位置搜索
				node e=que3.front();que3.pop();
				for(int i=0;i<4;++i){
					int x=e.x+fx[i],y=e.y+fy[i];
					if(judge(x,y)){
						que2.push(node(e.kind,y,x));//搜索之后放入que2中
						f=0;
						mp[y][x]=e.kind+'0';
					}
				}
			}
			if(f)
				break;
		}//一个玩家已经走过了
		while(que2.size()){//入队列1
			que.push(que2.front());
			//cout<<"now,put que2 to que "<<que2.front().kind<<" "<<que2.front().x<<" "<<que2.front().y<<endl;
			que2.pop();
		}
//		cout<<"-==========-"<<endl;
//		for(int i=1;i<=n;++i){
//			for(int j=1;j<=m;++j){
//				cout<<mp[i][j]<<" "; 
//			}
//			cout<<endl;
//		}cout<<"-==========-"<<endl;
	}
}
int cmp(node a,node b){
	return a.kind<b.kind;
}
int main(){
	while(cin>>n>>m>>p){
		clean(sum,0);
		while(que.size())	que.pop();
		for(int i=1;i<=p;++i)
			cin>>v[i];
		int k=1;
		for(int i=1;i<=n;++i){
			for(int j=1;j<=m;++j){
				cin>>mp[i][j];
				if(mp[i][j]>='1'&&mp[i][j]<='9')
					arr[k++]=node(mp[i][j]-'0',i,j);
			}
		}
		sort(arr+1,arr+k,cmp);
		for(int i=1;i<k;++i){
			que.push(arr[i]);
		}
		bfs();
		for(int i=1;i<=n;++i){
			for(int j=1;j<=m;++j){
				if(mp[i][j]!='#'&&mp[i][j]!='.')
					sum[mp[i][j]-'0']++;
			}
		}
		for(int i=1;i<=p;++i){
			cout<<sum[i]<<" ";
		}cout<<endl;
		
	}
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值