NOIP 2015 提高组 Day1
2017-04-21 15:14
323 查看
期望得分:100+100+100=300
实际得分:100+100+45=245
T3 相似的代码 复制过去 没有改全,痛失55分
http://www.cogs.pro/cogs/page/page.php?aid=16
T1 神奇的幻方
当N为奇数时,我们可以通过以下方法构建一个幻方:
首先将1写在第一行的中间。
之后,按如下方式从小到大依次填写每个数K(K=2,3,…,N*N):
1.若(K−1)在第一行但不在最后一列,则将K填在最后一行,(K−1)所在列的右一列;
2.若(K−1)在最后一列但不在第一行,则将K填在第一列,(K−1)所在行的上一行;
3.若(K−1)在第一行最后一列,则将K填在(K−1)的正下方;
4.若(K−1)既不在第一行,也不在最后一列,如果(K−1)的右上方还未填数,则将K填在(K−1)的右上方,否则将K填在(K−1)的正下方。
现给定N请按上述方法构造N*N的幻方。
输入文件只有一行,包含一个整数N即幻方的大小。
输出格式:
输出文件包含N行,每行N个整数,即按上述方法构造出的N*N的幻方。相邻两个整数之间用单个空格隔开。
输出样例#1:
View Code
今天发现那是错误的
因为 在qita()函数里
几张牌就只能按几张牌出
但事实上是 若3张牌,可以按对子+单牌出
官方数据竟然没卡掉
数据:
1 9
3 1
3 2
3 35 1
5 2
5 38 1
8 2
8 3
输出:2
实际得分:100+100+45=245
T3 相似的代码 复制过去 没有改全,痛失55分
http://www.cogs.pro/cogs/page/page.php?aid=16
T1 神奇的幻方
题目描述
幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行、每列及两条对角线上的数字之和都相同。当N为奇数时,我们可以通过以下方法构建一个幻方:
首先将1写在第一行的中间。
之后,按如下方式从小到大依次填写每个数K(K=2,3,…,N*N):
1.若(K−1)在第一行但不在最后一列,则将K填在最后一行,(K−1)所在列的右一列;
2.若(K−1)在最后一列但不在第一行,则将K填在第一列,(K−1)所在行的上一行;
3.若(K−1)在第一行最后一列,则将K填在(K−1)的正下方;
4.若(K−1)既不在第一行,也不在最后一列,如果(K−1)的右上方还未填数,则将K填在(K−1)的右上方,否则将K填在(K−1)的正下方。
现给定N请按上述方法构造N*N的幻方。
输入输出格式
输入格式:输入文件只有一行,包含一个整数N即幻方的大小。
输出格式:
输出文件包含N行,每行N个整数,即按上述方法构造出的N*N的幻方。相邻两个整数之间用单个空格隔开。
输入输出样例
输入样例#1:3
输出样例#1:
8 1 6 3 5 7 4 9 2
#include<cstdio> #include<cstring> using namespace std; int t,n,a[20],b[5],ans=0x7fffffff; void dfs(int); void pre() { ans=0x7fffffff; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); } void shunzi(int now) { for(int i=3;i<=14;i++) { int j=i; while(a[j]>=1) j++; if(j-i>=5) { for(int h=i+4;h<=j-1;h++) { for(int k=i;k<=h;k++) a[k]--; dfs(now+1); for(int k=i;k<=h;k++) a[k]++; } } } } void liandui(int now) { for(int i=3;i<=14;i++) { int j=i; while(a[j]>=2) j++; if(j-i>=3) { for(int h=i+2;h<=j-1;h++) { for(int k=i;k<=h;k++) a[k]-=2; dfs(now+1); for(int k=i;k<=h;k++) a[k]+=2; } } } } void feiji(int now) { for(int i=3;i<=14;i++) { int j=i; while(a[j]>=3) j++; if(j-i>=2) { for(int h=i+1;h<=j-1;h++) { for(int k=i;k<=h;k++) a[k]-=3; dfs(now+1); for(int k=i;k<=h;k++) a[k]+=3; } } } } int qita() { memset(b,0,sizeof(b)); int tot=0; for(int i=3;i<=17;i++) b[a[i]]++; while(b[4]>=1&&b[2]>=2) b[2]-=2,b[4]--,tot++; while(b[4]>=1&&b[1]>=2) b[1]-=2,b[4]--,tot++; while(b[4]>=1&&b[2]>=1) b[2]--,b[4]--,tot++; while(b[3]>=1&&b[2]>=1) b[3]--,b[2]--,tot++; while(b[3]>=1&&b[1]>=1) b[3]--,b[1]--,tot++; return tot+b[1]+b[2]+b[3]+b[4]; } void dfs(int now) { if(now>=ans) return; int tmp=qita(); if(now+tmp<ans) ans=now+tmp; feiji(now); liandui(now); shunzi(now); } int main() { scanf("%d%d",&t,&n); while(t--) { pre(); for(int i=1;i<=n;i++) { int x,y; scanf("%d%d",&x,&y); if(x==2) x=16; if(x==1) x=14; if(x==0) x=17; a[x]++; } dfs(0); printf("%d\n",ans); } }
View Code
今天发现那是错误的
因为 在qita()函数里
几张牌就只能按几张牌出
但事实上是 若3张牌,可以按对子+单牌出
官方数据竟然没卡掉
数据:
1 9
3 1
3 2
3 35 1
5 2
5 38 1
8 2
8 3
输出:2
相关文章推荐
- {小结}NOIP2015提高组Day1
- NOIP2015 提高组 day1 信息传递
- JZOJsenior4325、luoguP2668.【NOIP2015提高组Day1】斗地主
- 信息传递 NOIP2015 提高组 Day1 T2
- JZOJsenior4323.【NOIP2015提高组Day1】神奇的幻方
- 4325. 【NOIP2015提高组Day1】斗地主
- 【NOIP2015提高组Day1】斗地主
- JZOJsenior4324.【NOIP2015提高组Day1】信息传递
- 【jzoj4325】【NOIP2015提高组Day1】【斗地主】
- XJOI-NOIP2015提高组模拟题1 day1
- Noip2015 提高组 Day1
- NOIP 2015 提高组 Day1 信息传递
- 【NOIP2015提高组Day1】信息传递
- Noip提高组2015 Day1 T2 信息传递 tarjan
- XJOI——NOIP2015提高组模拟题19-day1——观光旅行
- NOIP2015提高组day1 —— 信息传递(message)
- 神奇的幻方 NOIP2015 提高组 Day1 T1
- NOIP2015 提高组 day1 信息传递
- NOIP 2015 提高组 Day1 斗地主
- NOIP 2015 提高组 Day1 神奇的幻方