字串变换
这题用string比较简单,string有许多自带函数和性质比较方便,如果用char的话比较麻烦,可是在做这道题的时候不知道这些,然后用char打了个超级麻烦的代码
string支持两个字符串直接相加
s.insert(pos,s2)
s.substr(pos,len);
s.erase(pos,len);
s.replace(pos,len,s2);
s.find(s2,pos) 如果查找不到返回string::nops
靶形数独
这道题比较简单,dfs参数代表搜到第几个空位置,每一层dfs枚举9--1,然后搜到x==num+1是,ans取max
#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
#include<algorithm>
using namespace std;
int a[10][10],be[10][10],c[10][10];
bool lvis[10][10],hvis[10][10],vis[10][10];
struct node
{
int x,y;
}t[88];
int num=0,ans;
int cmp(const node &a,const node &b)
{
return a.y==b.y? a.x<b.x : a.y<b.y;
}
void pre()
{
c[1][1]=6;c[1][2]=6;c[1][3]=6;c[1][4]=6;c[1][5]=6; c[1][6]=6;c[1][7]=6;c[1][8]=6;c[1][9]=6;
c[2][1]=6;c[2][2]=7;c[2][3]=7;c[2][4]=7;c[2][5]=7; c[2][6]=7;c[2][7]=7;c[2][8]=7;c[2][9]=6;
c[3][1]=6;c[3][2]=7;c[3][3]=8;c[3][4]=8;c[3][5]=8; c[3][6]=8;c[3][7]=8;c[3][8]=7;c[3][9]=6;
c[4][1]=6;c[4][2]=7;c[4][3]=8;c[4][4]=9;c[4][5]=9; c[4][6]=9;c[4][7]=8;c[4][8]=7;c[4][9]=6;
c[5][1]=6;c[5][2]=7;c[5][3]=8;c[5][4]=9;c[5][5]=10;c[5][6]=9;c[5][7]=8;c[5][8]=7;c[5][9]=6;
c[6][1]=6;c[6][2]=7;c[6][3]=8;c[6][4]=9;c[6][5]=9; c[6][6]=9;c[6][7]=8;c[6][8]=7;c[6][9]=6;
c[7][1]=6;c[7][2]=7;c[7][3]=8;c[7][4]=8;c[7][5]=8; c[7][6]=8;c[7][7]=8;c[7][8]=7;c[7][9]=6;
c[8][1]=6;c[8][2]=7;c[8][3]=7;c[8][4]=7;c[8][5]=7; c[8][6]=7;c[8][7]=7;c[8][8]=7;c[8][9]=6;
c[9][1]=6;c[9][2]=6;c[9][3]=6;c[9][4]=6;c[9][5]=6; c[9][6]=6;c[9][7]=6;c[9][8]=6;c[9][9]=6;
}
void read()
{
for(int i=1;i<=3;i++)
for(int j=1;j<=9;j++)
{
if(j<=3) {be[i][j]=1;continue;}
if(j<=6) {be[i][j]=4;continue;}
if(j<=9) {be[i][j]=7;continue;}
}
for(int i=4;i<=6;i++)
for(int j=1;j<=9;j++)
{
if(j<=3) {be[i][j]=2;continue;}
if(j<=6) {be[i][j]=5;continue;}
if(j<=9) {be[i][j]=8;continue;}
}
for(int i=7;i<=9;i++)
for(int j=1;j<=9;j++)
{
if(j<=3) {be[i][j]=3;continue;}
if(j<=6) {be[i][j]=6;continue;}
if(j<=9) {be[i][j]=9;continue;}
}
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++){
scanf("%d",&a[i][j]);
if(a[i][j]!=0) lvis[j][a[i][j]]=1;hvis[i][a[i][j]]=1;vis[be[i][j]][a[i][j]]=1;
if(a[i][j]==0) { num++;t[num].x=i;t[num].y=j; }
}
sort(t+1,t+num+1,cmp);
}
int op=0;
void dfs(int now)
{
if(now==num+1){ ans=max(ans,op); return ; }
int x=t[now].x,y=t[now].y;
for(int i=9;i>=1;i--)
if(lvis[y][i]==0&&hvis[x][i]==0&&vis[be[x][y]][i]==0){
lvis[y][i]=1; hvis[x][i]=1; vis[be[x][y]][i]=1;
op+=c[x][y]*i;
dfs(now+1);
lvis[y][i]=0; hvis[x][i]=0; vis[be[x][y]][i]=0;
op-=c[x][y]*i;
}
}
int main()
{
pre();
read();
ans=-1;
dfs(1);
if(ans==-1) printf("%d",ans);
else{
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++)
if(a[i][j]) ans+=a[i][j]*c[i][j];
printf("%d",ans);
}
return 0;
}
传染病控制
bfs按深度记录节点,传染病会随着深度扩散,显然每层深度的所有节点中只有一个节点到他父亲的边会被切断,
对于一个节点如果他到他父亲的边被切断,标记一下,然后搜到每一层的时候,先下传标记,即
if(vis[fa[x]]==1) vis[x]=1;
用这一层节点数-被标记的点数-1就是这一层会被感染的节点数
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#define maxn 305
using namespace std;
int n,p;
int ans,maxdeep,op=0;
struct edge
{
int to,ne;
}b[maxn*2];
vector< int > v[maxn];
int k=0,head[maxn],fa[maxn],d[maxn],sz[maxn];
bool vis[maxn];
int cmp(const int &a,const int &b){
return sz[a]>sz[b];
}
void dfs1(int x,int father,int deep)
{
fa[x]=father;sz[x]=1;d[x]=deep;
v[deep].push_back(x);
for(int i=head[x];i!=-1;i=b[i].ne)
if(b[i].to!=fa[x]){ dfs1(b[i].to,x,deep+1); sz[x]+=sz[b[i].to]; }
maxdeep=max(maxdeep,deep);
}
void add(int u,int v)
{
k++;
b[k].to=v;b[k].ne=head[u];head[u]=k;
}
void read()
{
memset(head,-1,sizeof(head));
scanf("%d%d",&n,&p);
int x,y;
for(int i=1;i<=p;i++){
scanf("%d%d",&x,&y);
add(x,y); add(y,x);
}
dfs1(1,0,0);
for(int i=1;i<=maxdeep;i++)
sort(v[i].begin(),v[i].end(),cmp);
}
void dfs(int x)
{
if(op>ans) return;
if(x>maxdeep){ ans=min(op,ans); return; }
if(v[x].empty()==1) return ;
int js=0;
for(int i=0;i<v[x].size();i++)
{
int t=v[x][i];
if(vis[fa[t]]==1) vis[v[x][i]]=1;
if(vis[v[x][i]]==0) js++;
}
if(js==0) ans=min(ans,op);
for(int i=0;i<v[x].size();i++)
if(vis[v[x][i]]==0){
op+=(js-1);
vis[v[x][i]]=1;
dfs(x+1);
op-=(js-1);
vis[v[x][i]]=0;
}
for(int i=0;i<v[x].size();i++)
{
int t=v[x][i];
if(vis[fa[t]]==1) vis[v[x][i]]=0;
}
}
int main()
{
read();
ans=n;op=1;
dfs(1);
printf("%d",ans);
return 0;
}