专栏文章

题解:UVA1607 与非门电路 Gates

UVA1607题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miqfnajz
此快照首次捕获于
2025/12/04 04:01
3 个月前
此快照最后确认于
2025/12/04 04:01
3 个月前
查看原文

题意

有一个电路,电路中一些个输入 xx,求与这个电路功能相同的电路,并使输入的 xx 数量尽量少。

思路

由于最小的 xx 满足单调性,则二分枚举 xx
电路可能有四种情况:
  1. 恒为1
  2. 恒为0
  3. xx
  4. 为非 xx

注意事项

由于答案可能经历多次改变,输入的内容也不一定会相同,但是无论哪种输入,xx 输入的次数都是相同的。

代码

本人平时写题不加空格,请见谅
CPP
#include<bits/stdc++.h>
using namespace std;
const int maxn=200000+5;
int n,m;
struct node
{
    int a,b,w;
}q[maxn];
int work(int k)
{
    for(int i=1;i<=m;i++)
	{
        int x=q[i].a;
        int y=q[i].b;
        int va=x<0?-x>k:q[x].w;
        int vb=y<0?-y>k:q[y].w;
        q[i].w=!(va&&vb);
    }
    return q[m].w;
}
int solve(int vx)
{
    int l=1,r=n;
    while(l<r)
	{
        int mid=l+(r-l)/2;
        if(work(mid)==vx) r=mid;
        else l=mid+1;
    }
    return l;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
	{
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++) scanf("%d%d",&q[i].a,&q[i].b);           
        int v0=work(0);
        int vx=work(n);
        if(v0==vx) for(int i=1;i<=n;i++) printf("0");
        else
		{
            int x=solve(vx);
            for(int i=1;i<x;i++) printf("0");
            printf("x");
            for(int i=x+1;i<=n;i++) printf("1");
        }
        printf("\n");
    }
    return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...