P3243 [HNOI2015]菜肴制作
应该很能看出是个拓扑排序,每道菜肴都有约束条件。
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int n,m,p,c[maxn],u,cnt,in[maxn],head[maxn],ans[maxn],g;
bool vis[maxn],flag;
priority_queue<int>q;
struct node
{
int to,nxt;
}e[maxn];
void add(int from,int to)
{
e[++cnt].to=to;
e[cnt].nxt=head[from];
head[from]=cnt;
}
void clean()
{
memset(head,0,sizeof(head));
memset(in,0,sizeof(in));
memset(c,0,sizeof(c));
memset(ans,0,sizeof(ans));
cnt=0;g=0;
while(!q.empty()) q.pop();
}
int main()
{
int t;scanf("%d",&t);
while(t--)
{
clean();
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int u,v;scanf("%d%d",&u,&v);
add(v,u);in[u]++;
}
for(int i=1;i<=n;i++)
if(!in[i]) q.push(i);
while(!q.empty())
{
int u=q.top();q.pop();
ans[++g]=u;
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].to;
in[v]--;
if(!in[v]) q.push(v);
}
}
if(g<n)
printf("Impossible!\n");
else{
for(int i=n;i>=1;i--)
{
printf("%d ",ans[i]);
}
cout<<endl;
}
}
return 0;
}
P1747 好奇怪的游戏
一道搜索的模拟题,注意细节。
#include <bits/stdc++.h>
using namespace std;
struct node
{
int x,y;
int step;
};
int dx[12]={2,-2,2,-2,1,1,-1,-1,2,2,-2,-2};
int dy[12]={2,2,-2,-2,2,-2,2,-2,1,-1,1,-1};
bool vis[1000][1000];
queue<node>q;
void bfs(int x,int y)
{
node cur,nxt;
cur.x=x;
cur.y=y;
cur.step=0;
q.push(cur);
vis[x][y]=1;
while(!q.empty())
{
cur=q.front();
q.pop();
if(cur.x==1&&cur.y==1)
{
cout<<cur.step<<endl;
return;
}
for(int i=0;i<12;i++)
{
nxt.x=cur.x+dx[i];
nxt.y=cur.y+dy[i];
if(vis[nxt.x][nxt.y]==0 &&nxt.x>=1&&nxt.y>=1)
{
vis[nxt.x][nxt.y]=1;
nxt.step=cur.step+1;
q.push(nxt);
}
}
}
}
int main()
{
int x1,y_1,x2,y2;
cin>>x1>>y_1>>x2>>y2;
bfs(x1,y_1);
memset(vis,0,sizeof(vis));
while(!q.empty()) //²»Îª¿Õʱ·µ»Ø0
q.pop();
bfs(x2,y2);
return 0;
}
一道省赛思维题,难点在于题意得理解,不过根据样例也能猜的八九不离十。思维上对于我来说也是有点难度。。。。
#include <bits/stdc++.h>
using namespace std;
const int N=3e5+5;
int n,ans1,ans2,a[N],b[N];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int x,y;cin>>x>>y;
ans1+=4;ans2+=4;
if(a[x])
ans1-=2;
if(b[x])
ans2-=2;
if(a[x]<a[x+1])
ans1-=2;
if(x>=1&&a[x]<a[x-1])
ans1-=2;
if(b[y]<b[y+1])
ans2-=2;
if(y>=1&&b[y]<b[y-1])
ans2-=2;
a[x]++;b[y]++;
cout<<ans1<<" "<<ans2<<endl;
}
return 0;
}