- 1、本文档共17页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
铝合金电缆lca报告
铝合金电缆lca报告
NOIP2015提高组解题报告
NOIP2015提高组解题报告
T1 神奇的幻方
【题目大意】 告诉你幻方的构造方法,给出N*N幻方的方案。N≤39且为奇数。
【解题说明】 直接模拟即可
【代码】
#includecstdio
int n,m,i,j,x,y,a[55][55];
int main(){
scanf(%d,amp;n);m=n*n;x=1;y=(n+1)/2;a[x][y]=1;
for(i=2;i=m;a[x][y]=i++)
if(x==1amp;amp;y!=n)x=n,y++;else if(x!=1amp;amp;y==n)y=1,x--;
else if(x==1amp;amp;y==n)x++,a[x][y]=i;else if(!a[x-1][y+1])x--,y++;else x++; for(i=1;i=n;i++)
for(j=1;j=n;j++){
printf(%d,a[i][j]);
if(jn)printf( );else puts();
}
}
【时间复杂度】 O(n) 【空间复杂度】 O(n)
【思想难度】 6 【编程难度】 8 【总用时】5 min
T2 信息传递
【题目大意】 在若干颗基环+内向树中找到一个最小的环。N≤200000,无自环。
【解题说明】
30分做法:Floyd找最小环
60分做法:每个点BFS一遍就可以了
100分做法:
① 基环+内向树的找环 直接套模板即可
② Tarjan 找到一个最小的size不为1的强连通分量即可
③ BFS/DFS 在暴力的基础上多加一个标记即可
④ 并查集 据说这也能做
【代码】
#includecstdio
#includealgorithm
#define N 222222
using namespace std;
int n,i,tm,tp,now,ans,sz,to[N],dfn[N],low[N],st[N];bool is[N];
void dfs(int x){
dfn[x]=low[x]=++tm;st[++tp]=x;is[x]=1;
int y=to[x];
if(!dfn[y])dfs(y),low[x]=min(low[x],low[y]);
else if(is[y])low[x]=min(low[x],dfn[y]);
if(low[x]==dfn[x]){
for(sz=now=0;now!=x;)now=st[tp--],sz++;
if(sz1)ans=min(ans,sz);
}
}
int main(){
for(ans=1e9,scanf(%d,amp;n),i=1;i=n;i++)scanf(%d,amp;to[i]);
for(i=1;i=n;i++)if(!dfn[i])dfs(i);
printf(%d,ans);
}
【时间复杂度】 O(n) 【空间复杂度】 O(n)
【思想难度】 25 【编程难度】 25 【总用时】15 min
T3 斗地主
【题目大意】 给你一副斗地主手牌,问你最快几次出完,数据随机,牌数不超过23。
【解题说明】
30分做法:N≤4,没有顺子,直接贪心即可。
60~70分做法:
① 写一个非常暴力的暴力。
② 写一个非常暴力的状压DP。
90分做法:状压DP再小小地优化一下,由于每种牌在读入数据出来后上限已经固定了,最差情况下是每种牌平均分布,状态表示需要3 *2=629856,转移再加一些优化,理论上能过,但CCF的机子太慢了会被卡10分
100分做法:
① 还是暴力,单牌和对牌最后处理就可以了,剩下的各种情况讨
论,随机数据轻松跑出。 ② 暴力+贪心,暴力枚顺子,剩下的牌肯定是可以贪心的,随便搞一搞就可以了
【代码】
#includecstdio
#includealgorithm
#includecstring
#define mxh 1000000007
using namespace std;
int ans,T,n,i,x,y,pai[6],cnt[15];
void find(int step){
int i,j,k,w;
if(step=ans)return;
ans=min(ans,step+pai[1]+pai[2]+pai[3]+pai[4]);
if(pai[4])for(i=2;i=14;i++)if(cnt[i]==4){
pai[4]--;cnt[i]-=4;
if(!pai[3]amp;amp;!pai[4]amp;amp;!pai[1]amp;amp;pai[2]=1){
ans=min(ans,step+1);
pai[4]++;cnt[i]+=4;
return;
} for(j=
文档评论(0)