您的位置:首页 > 其它

AtCoder Beginner Contest 075 总结

2017-10-15 15:09 471 查看
题目不难,但是只做出了两道题。今天补题的时候发现全是暴力……= =  

还是太菜了。:(

题目链接:点击打开链接



#include <iostream>
#include <map>
#include <set>
#include <string>
#include<string.h>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
int main(){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(a==b) printf("%d\n",c);
else if(a==c) printf("%d\n",b);
else printf("%d\n",a);
return 0;
}


B
#include <iostream>
#include <map>
#include <set>
#include <string>
#include<string.h>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
const int maxn=55;
char mp[maxn][maxn];
int f[maxn][maxn];
int main(){
int h,w;
scanf("%d%d",&h,&w);
memset(f,0,sizeof(f));
for(int i=0;i<h;i++){
scanf("%s",mp[i]);
}
for(int i=0;i<h;i++){
for(int j=0;j<w;j++){
if(mp[i][j]=='#'){
if(i-1>=0){
f[i-1][j]++;
}
if(j-1>=0){
f[i][j-1]++;
}
if(i+1<h){
f[i+1][j]++;
}
if(j+1<w){
f[i][j+1]++;
}
if(i-1>=0&&j-1>=0){
f[i-1][j-1]++;
}
if(i+1<h&&j-1>=0){
f[i+1][j-1]++;
}
if(i-1>=0&&j+1<w){
f[i-1][j+1]++;
}
if(i+1<h&&j+1<w){
f[i+1][j+1]++;
}
}
}
}
for(int i=0;i<h;i++){
for(int j=0;j<w;j++){
if(mp[i][j]=='#') printf("#");
else printf("%d",f[i][j]);
}printf("\n");
}
return 0;
}


C 看到N的范围最大才50…可以暴力,DFS搜索,每次删除一条边看能不能访问到所有的点,

#include <iostream>
#include <map>
#include <set>
#include <string>
#include<string.h>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;

/*

官方题解*/
const int maxn=55;
int n,m;
int a[maxn],b[maxn];
bool graph[maxn][maxn];
bool vis[maxn];

void dfs(int v){
vis[v]=true;
for(int v2=0;v2<n;++v2){
if(graph[v][v2]==false) continue;
if(vis[v2]==true) continue;
dfs(v2);
}
}

int main(){
cin>>n>>m;
for(int i=0;i<m;i++){
cin>>a[i]>>b[i];
a[i]--,b[i]--;
graph[a[i]][b[i]]=graph[b[i]][a[i]]=true;
}
int ans=0;
for(int i=0;i<m;i++){
graph[a[i]][b[i]]=graph[b[i]][a[i]]=false;
for(int j=0;j<n;j++){
vis[j]=false;
}
dfs(0);
bool bridge=false;
for(int i=0;i<n;i++){
if(!vis[i]) bridge=true;
}
if(bridge) ans++;
graph[a[i]][b[i]]=graph[b[i]][a[i]]=true;
}
cout<<ans<<endl;
return 0;
}

//*/



 N最大是50 没错还是暴力,n^5的暴力……。不过要注意输出lld 和I64d的区别  传送门

#include <iostream>
#include <map>
#include <set>
#include <string>
#include<string.h>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;

vector<long long> xray,yray;
int main(){
int n,k;
scanf("%d%d",&n,&k);
vector<long long> x(n),y(n);
for(int i=0;i<n;i++){
cin>>x[i]>>y[i];
xray.push_back(x[i]);
yray.push_back(y[i]);
}
sort(xray.begin(),xray.end());
sort(yray.begin(),yray.end());

ll ans=1LL*(xray[n-1]-xray[0])*(yray[n-1]-yray[0]);

for(int x1=0;x1<n;x1++){
for(int x2=x1+1;x2<n;x2++){
for(int y1=0;y1<n;y1++){
for(int y2=y1+1;y2<n;y2++){
ll lx=xray[x1],rx=xray[x2];
ll uy=yray[y2],dy=yray[y1];
int num=0;
for(int i=0;i<n;i++){
if(x[i]>=lx and x[i]<=rx&&y[i]<=uy&&y[i]>=dy){
num++;
}
}
if(num>=k) ans=min(ans,1LL*(rx-lx)*(uy-dy));
}
}
}
}
printf("%lld\n",ans);
// printf("%I64d\n",ans);
// cout<<ans<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: