zoukankan      html  css  js  c++  java
  • 【BZOJ4429】[Nwerc2015] Elementary Math小学数学 最大流

    【BZOJ4429】[Nwerc2015] Elementary Math小学数学

    Description

    Ellen给她的学生教小学数学。期末考试已经来临了。考试有n个题目,每一个题目学生们都要对一对数字进行加(+),减(-),乘(*)运算。
    Ellen已经选好了n对数。剩下的是决定学生们应该对每对数执行什么运算。为了不让学生们感到厌烦,Ellen想确保n个正确答案都不一样。
    请帮助Ellen自动化地构建考试。

    Input

    输入包括:
    第一行是一个整数n(1<=n<=2500),表示共有n道题目。
    接下来n行每行有2个整数a和b(-10^6<=a,b<=10^6),表示每一题使用的整数。

    Output

    对于输入中的每一对(a,b),输出一行有效的方程。每一个方程应该包含5部分:a,+、-、*中的一个运算符,b,=,答案。N个答案必须不同。
    如果有多个有效答案,你可以输出任意一个。如果没有答案,输出“impossible”。

    Sample Input

    Sample input 1
    4
    1 5
    3 3
    4 5
    -1 -6
    Sample input 2
    4
    -4 2
    -4 2
    -4 2
    -4 2

    Sample Output

    Sample output 1
    1 + 5 = 6
    3 * 3 = 9
    4 - 5 = -1
    -1 - -6 = 5
    Sample output 2
    impossible

    题解:傻题,将所有可能的结果用map存一下,然后建图跑最大流即可。

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <queue>
    #include <map>
    using namespace std;
    typedef long long ll;
    queue<int> q;
    int n,m,cnt,S,T,ans;
    ll ref[10010],ra[2510],rb[2510];
    int to[100000],next[100000],head[10010],val[100000],d[10010];
    map<ll,int> mp;
    
    inline void add(int a,int b,int c)
    {
    	to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++;
    	to[cnt]=a,val[cnt]=0,next[cnt]=head[b],head[b]=cnt++;
    }
    int dfs(int x,int mf)
    {
    	if(x==T)	return mf;
    	int i,k,temp=mf;
    	for(i=head[x];i!=-1;i=next[i])	if(d[to[i]]==d[x]+1&&val[i])
    	{
    		k=dfs(to[i],min(temp,val[i]));
    		if(!k)	d[to[i]]=0;
    		temp-=k,val[i]-=k,val[i^1]+=k;
    		if(!temp)	break;
    	}
    	return mf-temp;
    }
    int bfs()
    {
    	while(!q.empty())	q.pop();
    	memset(d,0,sizeof(d));
    	q.push(S),d[S]=1;
    	int i,u;
    	while(!q.empty())
    	{
    		u=q.front(),q.pop();
    		for(i=head[u];i!=-1;i=next[i])	if(!d[to[i]]&&val[i])
    		{
    			d[to[i]]=d[u]+1;
    			if(to[i]==T)	return 1;
    			q.push(to[i]);
    		}
    	}
    	return 0;
    }
    inline int rd()
    {
    	int ret=0,f=1;	char gc=getchar();
    	while(gc<'0'||gc>'9')	{if(gc=='-')	f=-f;	gc=getchar();}
    	while(gc>='0'&&gc<='9')	ret=ret*10+(gc^'0'),gc=getchar();
    	return ret*f;
    }
    int main()
    {
    	n=m=rd(),S=0;
    	int i,j;
    	memset(head,-1,sizeof(head));
    	for(i=1;i<=n;i++)
    	{
    		ra[i]=rd(),rb[i]=rd();
    		if(!mp[ra[i]+rb[i]])	mp[ra[i]+rb[i]]=++m,ref[m]=ra[i]+rb[i];
    		if(!mp[ra[i]-rb[i]])	mp[ra[i]-rb[i]]=++m,ref[m]=ra[i]-rb[i];
    		if(!mp[ra[i]*rb[i]])	mp[ra[i]*rb[i]]=++m,ref[m]=ra[i]*rb[i];
    		add(i,mp[ra[i]+rb[i]],1);
    		add(i,mp[ra[i]-rb[i]],1);
    		add(i,mp[ra[i]*rb[i]],1);
    		add(S,i,1);
    	}
    	T=m+1;
    	for(i=n+1;i<=m;i++)	add(i,T,1);
    	while(bfs())	ans+=dfs(S,1<<30);
    	if(ans!=n)
    	{
    		printf("impossible");
    		return 0;
    	}
    	for(i=1;i<=n;i++)
    	{
    		for(j=head[i];j!=-1;j=next[j])	if(!val[j])
    		{
    			if(ref[to[j]]==ra[i]+rb[i])	printf("%lld + %lld = %lld
    ",ra[i],rb[i],ra[i]+rb[i]);
    			else	if(ref[to[j]]==ra[i]-rb[i])	printf("%lld - %lld = %lld
    ",ra[i],rb[i],ra[i]-rb[i]);
    			else	if(ref[to[j]]==ra[i]*rb[i])	printf("%lld * %lld = %lld
    ",ra[i],rb[i],ra[i]*rb[i]);
    		}
    	}
    	return 0;
    }
  • 相关阅读:
    mysql,windows自动备份设置
    彻底搞清楚javascript中的require、import和export
    Spring Boot 打包报错Failed to execute goal org.apache.maven.plugins:mavenresourcesplugin:3.2.0
    Spring AOP 切点切面
    12.5M 30M 90M DEM免费下载!【转】
    JS 中的数组遍历方式效率比较[转]
    cesium加载CAD模型(.dwg)
    Cesium发布下一代3D Tiles规范预览
    cesium点击面高亮事件[转]
    MySQL 5.7及8.0版本数据库的root密码遗忘的解决办法
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/7859698.html
Copyright © 2011-2022 走看看