链接
T1:
连接的它们不能为同一种颜色
所以输出最大+1(自己)
#include<iostream>
#include<cstdio>
using namespace std;
int a[100100],x,y,n;
int main(){
freopen("planting.in","r",stdin);
freopen("planting.out","w",stdout);
cin>>n;
for(int i=1;i<n;i++){
cin>>x>>y;
a[x]++;
a[y]++;
}
int maxx=0;
for(int i=1;i<=n;i++){
maxx=max(maxx,a[i]+1);
}
cout<<maxx;
return 0;
}
T2:
暴力搜,遇到旁边有’.'的时候周长+1
开头加个特判
#include<iostream>
#include<cstdio>
using namespace std;
int m,n,k;
char a[2002][2002];
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
void dfs(int x,int y){
for(int i=0;i<4;i++){
int xx=x+dx[i];
int yy=y+dy[i];
if(xx>n||xx<1||yy>n||yy<1||a[xx][yy]=='.')k++;
if(xx>n||xx<1||yy>n||yy<1||a[xx][yy]=='.'||a[xx][yy]=='1')continue;
else{
a[xx][yy]='1';
m++;
dfs(xx,yy);
}
}
}
int main(){
freopen("perimeter.in","r",stdin);
freopen("perimeter.out","w",stdout);
cin>>n;
int f=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
if(a[i][j]=='#')f++;
}
}
if(f==n*n){
cout<<n*n<<' '<<n*4;
return 0;
}
int maxx=0,maxx1=10001000;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(a[i][j]=='#'){
m=1;
k=0;
a[i][j]='1';
dfs(i,j);
if(m>maxx){
maxx=m;
maxx1=k;
}
if(m==maxx){
if(k<maxx1)maxx1=k;
}
}
}
}
cout<<maxx<<' '<<maxx1;
return 0;
}
T3:
排序(按最左和左相等最大右关键字)
贪心:由于我们叽里呱啦排序,得到了可以覆盖的
如果当右端点没超过前面的最大右端点(此时左已经处理(排序)),它被覆盖
否则你知道的
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,maxx;
struct node{
int x,y;
}a[1001000];
bool cmp(node x,node y){
return (x.x<y.x)||(x.x==y.x&&x.y>y.y);
}
int main(){
freopen("mountains.in","r",stdin);
freopen("mountains.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++){
int x1,y1;
cin>>x1>>y1;
a[i].x=x1-y1;
a[i].y=x1+y1;
}
sort(a+1,a+1+n,cmp);
maxx=0;
for(int i=1;i<=n;i++){
if(a[i].y>maxx){
maxx=a[i].y;
m++;
}
}
cout<<m;
return 0;
}