Codeforces Round #375 (Div. 2)【A,B【模拟】,D【DFS】】
PS_B:阿洗吧!B题卧槽数组开了250...
PS_D:D题主要挂在了50*50口算得了250,数组开小,然后一开始还错了。= =哎,以后对于数据范围还是注意一点;
卧槽,这场可真二百五了。。。
A题:
水~
#include<cstdio> #include<iostream> #include<string.h> #include<algorithm> using namespace std; const int N=1010; int sum; int ans=N; int a,b,c; int n,m; void solve() { for(int i=1;i<=100;i++) ans=min(ans,abs(i-a)+abs(i-b)+abs(i-c)); } int main() { scanf("%d%d%d",&a,&b,&c); solve(); printf("%d\n",ans); return 0; }
B题:
就是外面的模拟一下,里面还是不排除重复,直接搞搞就好了;
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int N=300; struct asd{ char s[N]; }; asd out[N]; asd in[N]; int num1,num2; char s[N]; char tmp[N]; bool Judge(char c) { if(c>='a'&&c<='z') return 1; if(c>='A'&&c<='Z') return 1; return 0; } int main() { int n; scanf("%d%s",&n,s); int flag=0; num1=num2=0; int num=0; for(int i=0;i<n;i++) { if(Judge(s[i])) { tmp[num++]=s[i]; } else { if(num) { tmp[num]='\0'; if(flag) strcpy(in[num1++].s,tmp); else strcpy(out[num2++].s,tmp); num=0; } if(s[i]=='(') flag=1; if(s[i]==')') flag=0; } } if(num) { tmp[num]='\0'; if(flag) strcpy(in[num1++].s,tmp); else strcpy(out[num2++].s,tmp); } int temp=strlen(out[0].s); for(int i=1;i<num2;i++) { int x=strlen(out[i].s); temp=max(x,temp); } printf("%d %d",temp,num1); return 0; }
题意:
给你一副图,“*”不能走,“.”称为水,水连通了被"*"围住就成了湖,水没有连通流向了边界就称为海,然后给你k,要求填满最少数量的水构造一个只有k个湖,
思路;
先四周搜一下,标记掉海;
然后搜里面,用个num标记所有的湖的名称,然后搞出个数,排个序
填了[num-k]个湖就好了;
#include<cstdio> #include<iostream> #include<string.h> #include<algorithm> using namespace std; const int N=55; int dx[4]={0,0,-1,1}; int dy[4]={1,-1,0,0}; char s[N][N]; int ma[N][N]; int n,m,k; void dfs_hu(int x,int y,int num) { ma[x][y]=num; for(int i=0;i<4;i++) { int xx=x+dx[i]; int yy=y+dy[i]; if(xx<0||yy<0||xx>=n||yy>=m) continue; if(s[xx][yy]=='.'&&ma[xx][yy]==0) { dfs_hu(xx,yy,num); } } } void dfs_hai(int x,int y) { ma[x][y]=-1; for(int i=0;i<4;i++) { int xx=x+dx[i]; int yy=y+dy[i]; if(xx<0||yy<0||xx>=n||yy>=m) continue; if(s[xx][yy]=='.'&&ma[xx][yy]==0) { dfs_hai(xx,yy); } } } void gaohai() { for(int i=0;i<n;i++) { if(s[i][0]=='.'&&ma[i][0]==0) { ma[i][0]==-1; dfs_hai(i,0); } } for(int i=0;i<n;i++) { if(s[i][m-1]=='.'&&ma[i][m-1]==0) { ma[i][m-1]==-1; dfs_hai(i,m-1); } } for(int i=0;i<m;i++) { if(s[0][i]=='.'&&ma[0][i]==0) { ma[0][i]=-1; dfs_hai(0,i); } } for(int i=0;i<m;i++) { if(s[n-1][i]=='.'&&ma[n-1][i]==0) { ma[n-1][i]=-1; dfs_hai(n-1,i); } } } struct asd{ int id; int w; }; asd q[3000]; bool cmp(asd x,asd y) { return x.w<y.w; } void debug() { for(int i=0;i<n;i++) { for(int j=0;j<m;j++) printf("%2d",ma[i][j]); puts(""); } } int main() { scanf("%d%d%d",&n,&m,&k); for(int i=0;i<n;i++) scanf("%s",s[i]); memset(ma,0,sizeof(ma)); gaohai(); int num=0; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(s[i][j]=='.'&&ma[i][j]==0) { num++; ma[i][j]=num; dfs_hu(i,j,num); } } } int pp[3000]; memset(pp,0,sizeof(pp)); int vis[3000]; memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(ma[i][j]==-1||!ma[i][j]) continue; pp[ma[i][j]]++; } } for(int i=1;i<=num;i++) { q[i].w=pp[i]; q[i].id=i; } int ans=0; sort(q+1,q+num+1,cmp); for(int i=1;i<=num-k;i++) { ans+=q[i].w; vis[q[i].id]=1; } printf("%d\n",ans); for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(vis[ma[i][j]]) { printf("*"); } else printf("%c",s[i][j]); } puts(""); } return 0; }