sduacm16级寒假热身赛解题报告
2017-01-13 22:14
253 查看
题目链接https://vjudge.net/contest/147139
password: acmlab2016
A - Bachgold Problem
【题意】
给一个2到100000的数,将它拆成若干个素数的和.并使这个数目最大.
【思路】
水题。
【Code】
B - Parallelogram is Back
【题意】
给你平行四边形三个点的坐标,让你写出第四个点的所有可能的坐标.
【思路】
一定有三种可能,并且可以由数学方法计算出。
【Code】
C - Lesha and array splitting
【题意】
就是让这个数列分为几个小部分,每一部分相加都不为0,将每一部分的下标的最左和最右分别输出。
【思路】
只需要考虑这个数列相加是否为0,如果不为0让其整个一部分为一部分,如果为0的话则分为两部分,
第一个不是0的数之前为一部分,之后为一部分,全为0的话就输出NO。
【Code】
D - Ilya and tic-tac-toe game
【题意】
给你一个初始的图,问你能否在一步操作中x取得胜利。
//一开始一直以为要博弈…英语渣渣不想说话
【思路】
暴力枚举x放的位置。然后判断是否存在连着3x的.
【Code】
E - New Year and Hurry
【题意】
你有240-k分钟的时间去解决至多n个问题,解决第i个问题需要5*i分钟。问最多能解决几个问题。
【思路】
水题。
【Code】
F - New Year and North Pole
【题意】
给你一组移动方案,问是否合法
【思路】
不必考虑东西方向,只考虑南北方向。而且由于在北极只能向南走,在南极只能向北走。就可以认为是一条长20000的线段,然后就简单了。
【Code】
G - Santa Claus and a Place in a Class
【题意】
给你个m*2n的矩阵,问k在哪个位置。
【思路】
水题。
【Code】
H - Santa Claus and Keyboard Check
【题意】
经过一定的对应规则将两个字符串转化为相同的字符串,问是否存在这种可能,如果存在输出所有对应规则
【思路】
将每一步字符的对应规则存储起来,对应原字符也要存储起来,但不需要输出.
如果与前面的对应规则矛盾就输出-1.
一开始没有仔细考虑wa了4发….
【Code】
I - Felicity is Coming!
【题意】
每个体育馆有一定数量的小精灵,每个宠物小精灵都有自己的类型。相同类型的小精灵会进化成相同类型的精灵,不同类型的小精灵进化成的精灵的类型都不相同。
你的任务是找到不同的进化计划的个数,使得所有宠物小精灵在它们的体育馆都进化过,且每个体育馆的每种类型的宠物小精灵的数量保持不变。
【思路】
保存下每个类型的小精灵所在体育馆,判断两个小精灵的在的体育馆种类和出现次数是否相同
在所在体育馆出现次数都相同的小精灵会组成一个个集合。设这些集合的大小为x1,x2,x3…..
对于一个大小为x的集合,方案数为x!,即为他们的全排列数。那么ans=x1!*x2!*x3!…..xk!
【Code】
password: acmlab2016
A - Bachgold Problem
【题意】
给一个2到100000的数,将它拆成若干个素数的和.并使这个数目最大.
【思路】
水题。
【Code】
#include<cstdio> int n; int main() { scanf("%d",&n); printf("%d\n",n/2); for (int i=0;i<n/2-1;i++) printf("2 "); if (n%2==0) printf("2\n"); else printf("3\n"); return 0; }
B - Parallelogram is Back
【题意】
给你平行四边形三个点的坐标,让你写出第四个点的所有可能的坐标.
【思路】
一定有三种可能,并且可以由数学方法计算出。
【Code】
#include<cstdio> using namespace std; int x1,x2,x3,y1,y2,y3; int main() { while(~scanf("%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3)) { printf("3\n"); printf("%d %d\n",x1+x2-x3,y1+y2-y3); printf("%d %d\n",x1+x3-x2,y1+y3-y2); printf("%d %d\n",x2+x3-x1,y2+y3-y1); } return 0; }
C - Lesha and array splitting
【题意】
就是让这个数列分为几个小部分,每一部分相加都不为0,将每一部分的下标的最左和最右分别输出。
【思路】
只需要考虑这个数列相加是否为0,如果不为0让其整个一部分为一部分,如果为0的话则分为两部分,
第一个不是0的数之前为一部分,之后为一部分,全为0的话就输出NO。
【Code】
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int a[1001],b[1001]; int main() { int n; while(~scanf("%d",&n)) { memset(a,0,sizeof(a)); int flag=0,sum=0; for(int i=1; i<=n; i++) { scanf("%d",&a[i]); sum+=a[i]; if(a[i]!=0&&flag==0) { flag=i; } } if(flag==0) printf("NO\n"); else{ if(sum!=0) printf("YES\n1\n1 %d\n",n); else printf("YES\n2\n1 %d\n%d %d\n",flag,flag+1,n); } } }
D - Ilya and tic-tac-toe game
【题意】
给你一个初始的图,问你能否在一步操作中x取得胜利。
//一开始一直以为要博弈…英语渣渣不想说话
【思路】
暴力枚举x放的位置。然后判断是否存在连着3x的.
【Code】
#include<cstdio> #include<cstring> using namespace std; char a[10][10]; int fx[8]={1,-1,0,0,1,-1,1,-1}; int fy[8]={0,0,1,-1,1,-1,-1,1}; int judge() { for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { if(a[i][j]=='x') { for(int z=0;z<8;z++) { int flag=0; for(int k=1;k<=2;k++) { int xx=i+fx[z]*k; int yy=j+fy[z]*k; if(xx>=0&&xx<4&&yy>=0&&yy<4) { if< 4000 /span>(a[xx][yy]=='x')continue; else flag=1; } else flag=1; } if(flag==0)return 1; } } } } return 0; } int main() { memset(a,'.',sizeof(a)); for(int i=0;i<4;i++) { scanf("%s",a[i]); } int flag=0; for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { if(a[i][j]=='.') { a[i][j]='x'; int tmp=judge(); a[i][j]='.'; if(tmp==1)flag=1; } } } if(flag==1)printf("YES\n"); else printf("NO\n"); }
E - New Year and Hurry
【题意】
你有240-k分钟的时间去解决至多n个问题,解决第i个问题需要5*i分钟。问最多能解决几个问题。
【思路】
水题。
【Code】
#include<cstdio> int main() { int ans,n,k; scanf("%d %d",&n,&k); for (int i=1;i<=n;i++) if (k+i*5<=240){ k+=i*5; ans=i; } printf("%d\n",ans); return 0; }
F - New Year and North Pole
【题意】
给你一组移动方案,问是否合法
【思路】
不必考虑东西方向,只考虑南北方向。而且由于在北极只能向南走,在南极只能向北走。就可以认为是一条长20000的线段,然后就简单了。
【Code】
#include<cstdio> char st[6]; int main() { int T,N,cut = 0,ok = 1; scanf("%d",&T); while(T--){ scanf("%d %s",&N,st); if((cut == 0 && st[0] != 'S') || (cut == 20000 && st[0] != 'N')) ok = 0; if(st[0] == 'S') cut += N; else if(st[0] == 'N') cut -= N; if(cut < 0 || cut > 20000) ok = 0; } if(!ok || cut != 0) printf("NO\n"); else printf("YES\n"); return 0; }
G - Santa Claus and a Place in a Class
【题意】
给你个m*2n的矩阵,问k在哪个位置。
【思路】
水题。
【Code】
#include<cstdio> int n,m,k,x=1,y=1; int main() { scanf("%d %d %d",&n,&m,&k); while (k>2*m){ k-=2*m; x++; } while (k>2){ k-=2; y++; } if (k==2) printf("%d %d R\n",x,y); else printf("%d %d L\n",x,y); return 0; }
H - Santa Claus and Keyboard Check
【题意】
经过一定的对应规则将两个字符串转化为相同的字符串,问是否存在这种可能,如果存在输出所有对应规则
【思路】
将每一步字符的对应规则存储起来,对应原字符也要存储起来,但不需要输出.
如果与前面的对应规则矛盾就输出-1.
一开始没有仔细考虑wa了4发….
【Code】
#include<cstdio> #include<string> #include<cstring> using namespace std; char s1[1001],s2[1001]; int ans=0,n; int c[150]; char d[30][2]; bool deal() { n=strlen(s1); for (int i=0;i<n;i++) { if (s1[i]!=s2[i]) { if (c[s1[i]]==s2[i]&&c[s2[i]]==s1[i]) continue; if (c[s1[i]]!=0&&c[s1[i]]!=s2[i]) return false; if (c[s2[i]]!=0&&c[s2[i]]!=s1[i]) return false; c[s1[i]]=s2[i]; c[s2[i]]=s1[i]; d[ans][0]=s1[i]; d[ans][1]=s2[i]; ans++; }else if (c[s1[i]]!=s1[i]&&c[s1[i]]!=0) return false; else if (c[s1[i]]==0){ c[s1[i]]=s1[i]; } } return true; } int main() { scanf("%s",s1); scanf("%s",s2); if (!deal()) { printf("-1\n"); return 0; } printf("%d\n",ans); for (int i=0;i<ans;i++) printf("%c %c\n",d[i][0],d[i][1]); return 0; }
I - Felicity is Coming!
【题意】
每个体育馆有一定数量的小精灵,每个宠物小精灵都有自己的类型。相同类型的小精灵会进化成相同类型的精灵,不同类型的小精灵进化成的精灵的类型都不相同。
你的任务是找到不同的进化计划的个数,使得所有宠物小精灵在它们的体育馆都进化过,且每个体育馆的每种类型的宠物小精灵的数量保持不变。
【思路】
保存下每个类型的小精灵所在体育馆,判断两个小精灵的在的体育馆种类和出现次数是否相同
在所在体育馆出现次数都相同的小精灵会组成一个个集合。设这些集合的大小为x1,x2,x3…..
对于一个大小为x的集合,方案数为x!,即为他们的全排列数。那么ans=x1!*x2!*x3!…..xk!
【Code】
#include<cstdio> #include<cstring> #include<algorithm> #include<vector> using namespace std; const int maxn = 1000005; const int mod = 1000000007; int n, m; vector<int> a[maxn]; int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ int num; scanf("%d",&num); while(num--){ int flag; scanf("%d",&flag); a[flag].push_back(i); } } sort(a+1,a+m+1); /*for(int i=1;i<=m;i++) { printf("%d----",i); for (int j=0;j<a[i].size();j++) printf("%d ",a[i][j]); printf("\n"); }*/ long long ans = 1; int fnum=1; for(int i=2;i<=m;i++) if(a[i] == a[i-1]){ fnum++; ans = (ans*fnum)%mod; }else fnum= 1; printf("%lld\n",ans); return 0; }
相关文章推荐
- sduacm16级寒假训练 动态规划(二)
- SDUT - 2017年寒假集训 阶段测试赛3(组队) -- 解题报告
- 寒假训练4解题报告
- 寒假训练5解题报告
- 2018年全国多校算法寒假训练营练习比赛(第二场)解题报告
- sduacm16级寒假热身
- sduacm16级寒假训练 搜索与背包
- sduacm16级寒假训练 动态规划(一)
- UESTC 第五届ACM趣味程序设计竞赛第一场(热身赛,非原创题) 解题报告
- 寒假训练3解题报告 CodeForces #148
- sduacm16级寒假训练 搜索与背包
- SDUT - 2017年寒假集训 阶段测试赛3(个人) -- 解题报告
- SDUACM16级寒假热身1
- 哈理工新生赛热身赛解题报告
- HNU 省赛选拔热身赛City Merger解题报告
- 2018年全国多校算法寒假训练营练习比赛(第四场)解题报告
- 中南大学ACM12月月赛第二场热身赛解题报告
- sduacm16级寒假训练 素筛 快速幂 GCD
- 2015年nefu寒假集训结构体排序专题解题报告
- FOJFOJ有奖月赛-2012年4月(校赛热身赛)-解题报告总结