2021.08.14【NOIP提高B组】模拟 【USACO 2021 US Open, Silver】Do You Know Your ABCs?

编程入门 行业动态 更新时间:2024-10-27 14:24:58

2021.08.14【<a href=https://www.elefans.com/category/jswz/34/1767340.html style=NOIP提高B组】模拟 【USACO 2021 US Open, Silver】Do You Know Your ABCs?"/>

2021.08.14【NOIP提高B组】模拟 【USACO 2021 US Open, Silver】Do You Know Your ABCs?

思路:

直接暴力枚举每个位置对应的数,然后把a,b,c判断出来,然后check就可以了

c o d e code code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
#include<cstring>using namespace std;int t, ans;
int n, b[10], c[10], a[10];
map<pair<int, pair<int, int> >, int>q;bool check_()
{return c[1]<=c[2]&&c[2]<=c[3]&&!q[make_pair(c[1], make_pair(c[2], c[3]))]&&(!b[1]||b[1]==c[1])&&(!b[2]||b[2]==c[2])&&(!b[3]||b[3]==c[3])&&(!b[4]||(b[4]==c[1]+c[2]))&&(!b[5]||(b[5]==c[1]+c[3]))&&(!b[6]||(b[6]==c[2]+c[3]))&&(!b[7]||(b[7]==c[1]+c[2]+c[3]));
}void check()
{
//	for(int i=1; i<=7; i++)
//		cout<<b[i]<<' ';
//	cout<<endl;memset(c, 0, sizeof(c));if(b[1]&&b[2]&&b[3]){c[1]=b[1], c[2]=b[2], c[3]=b[3];if(check_())ans++, q[make_pair(c[1], make_pair(c[2], c[3]))]=1;return;}if(b[1]&&b[2]){c[1]=b[1], c[2]=b[2];if(b[5])c[3]=b[5]-c[1];else if(b[7])c[3]=b[7]-c[1]-c[2];else if(b[6])c[3]=b[6]-c[2];	if(check_())ans++, q[make_pair(c[1], make_pair(c[2], c[3]))]=1;return;}if(b[2]&&b[3]){c[2]=b[2], c[3]=b[3];if(b[5])c[1]=b[5]-c[3];else if(b[7])c[1]=b[7]-c[3]-c[2];else if(b[4])c[1]=b[4]-c[2];if(check_())ans++, q[make_pair(c[1], make_pair(c[2], c[3]))]=1;return;}if(b[1]&&b[3]){c[1]=b[1], c[3]=b[3];if(b[4])c[2]=b[4]-c[1];else if(b[7])c[2]=b[7]-c[1]-c[3];else if(b[6])c[2]=b[6]-c[3];	if(check_())ans++, q[make_pair(c[1], make_pair(c[2], c[3]))]=1;return;}if(b[1]){c[1]=b[1];if(b[4])c[2]=b[4]-c[1];if(b[5])c[3]=b[5]-c[1];if(b[7])c[6]=b[7]-c[1];if(!c[6])c[6]=b[6];if(b[6]&&c[3])c[2]=b[6]-c[3];elseif(b[6]&&c[2])c[3]=b[6]-c[2];if(check_())ans++, q[make_pair(c[1], make_pair(c[2], c[3]))]=1;return;}if(b[2]){c[2]=b[2];if(b[4])c[1]=b[4]-c[2];if(b[6])c[3]=b[6]-c[2];if(b[7])c[5]=b[7]-c[2];if(!c[5])c[5]=b[5];if(b[5]&&c[3])c[1]=b[5]-c[3];elseif(b[5]&&c[1])c[3]=b[5]-c[1];if(check_())ans++, q[make_pair(c[1], make_pair(c[2], c[3]))]=1;return;}if(b[3]){c[3]=b[3];if(b[5])c[1]=b[5]-c[3];if(b[6])c[2]=b[6]-c[3];if(b[7])c[4]=b[7]-c[3];if(!c[4])c[4]=b[4];if(b[4]&&c[1])c[2]=b[4]-c[1];elseif(b[4]&&c[2])c[1]=b[4]-c[2];if(check_())ans++, q[make_pair(c[1], make_pair(c[2], c[3]))]=1;return;}c[1]=b[7]-b[6];c[2]=b[7]-b[5];c[3]=b[7]-b[4];if(check_())ans++, q[make_pair(c[1], make_pair(c[2], c[3]))]=1;
}void dfs(int x, int k)
{if(x==8&&k!=n+1)return;if(k>n){check();swap(b[3], b[4]);check();swap(b[3], b[4]);return;}dfs(x+1, k);b[x]=a[k];dfs(x+1, k+1);b[x]=0;
}int main()
{scanf("%d", &t);while(t--){scanf("%d", &n);for(int i=1; i<=n; i++)scanf("%d", &a[i]);sort(a+1, a+1+n);dfs(1, 1);printf("%d\n", ans);ans=0, q.clear();
//		memset(c, 0, sizeof(c));
//		memset(b, 0, sizeof(b));}return 0;
}

更多推荐

2021.08.14【NOIP提高B组】模拟 【USACO 2021 US Open, Silver】Do You Know Your ABCs?

本文发布于:2024-03-23 20:50:56,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1742684.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:NOIP   USACO   Silver   ABCs   Open

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!