ACMICPC竞赛常见问题解答
2020icpc上海部分题解
2020icpc上海部分题解B题⽬⼤意 给你两张扫雷图A和B,你最多对B修改⌊MN2⌋次,问是否能让B中的数字之和等于A。
解题思路 扫雷图中的数字等价于相邻的⾮雷格⼦与空⽩格⼦的对数,相当于⼀张⿊⽩⾊的图,很明显,⿊⽩颜⾊是相对的,即是交换颜⾊,相邻的⿊⽩颜⾊的对数也不会改变(就像把⿊⽩对改成⽩⿊对那样)。
所以对⽐两个图中不同的块的个数,如果⼩于⌊MN2⌋就直接输出A,否则输出A格⼦翻转之后的图。
代码const int maxn = 1e3+10;int n, m;char g1[maxn][maxn], g2[maxn][maxn], g3[maxn][maxn];int solve(char ga[maxn][maxn], char gb[maxn][maxn]) {int cnt = 0;for (int i = 1; i<=n; ++i)for (int j = 1; j<=m; ++j)if (ga[i][j]!=gb[i][j]) ++cnt;return cnt;}int main() {IOS;cin >> n >>m;for (int i = 1; i<=n; ++i) cin >> g1[i]+1;for (int i = 1; i<=n; ++i) cin >> g2[i]+1;for (int i = 1; i<=n; ++i)for (int j = 1; j<=m; ++j) {if (g1[i][j]=='.') g3[i][j] = 'X';else g3[i][j] = '.';}if (solve(g1, g2)<=n*m/2) {for (int i = 1; i<=n; ++i) cout << g1[i]+1 << endl;}else if (solve(g3, g2)<=n*m/2) {for (int i = 1; i<=n; ++i) cout << g3[i]+1 << endl;}return 0;}C题⽬⼤意 给你两个数X和Y,求下⾯式⼦解题思路 可以考虑数位dp按位填数,i&j=0说明同⼀位不同1,⽽后⾯的取log相当于求i和j中最⾼的那个⼆进制位位数。
国际大学生程序设计大赛(ACM-icpc)输入输出介绍
2020/9/9
16
本类输入解决方案:
C语法: char buf[20]; gets(buf);
C++语法: 如果用string buf;来保存: getline( cin , buf ); 如果用char buf[ 255 ]; 来保存: cin.getline( buf, 255 );
2020/9/9
int main()
{
int icase,n,i,j,a,sum;
scanf("%d",&icase);
for(i=0;i<icase;i++)
{
sum=0;
scanf("%d",&n);
for(j=0;j<n;j++)
{
scanf("%d",&a);
sum+=a;
}
if(i<icase-1)
2020/9/9
11
本类输入解决方案:
C语法:
scanf("%d",&n) ;
for( i=0 ; i<n ; i++ ) {
ACM比赛用判题信息说明
判题信息说明(1) Queuing等待判题可能原因:1、提交人比较多,系统判题不够快2、程序需要运行一段时间解决方法:刷新一下页面,或等一会再刷新(2) Presentation Error格式错误可能原因:●1、结果当中多了或少了空格或是回车,这个是最有可能的原因●2、程序结果是错的解决方法:●1、检查一下有没有多或少空格或回车,即你的输出格式是不是和题目要求的一样●2、对于2,只能重新读题,看程序哪里写错了(3) Wrong Answer答案错误可能原因:●1、程序的算法是错的(可能是由题目理解错导致的)●2、文件读入没有注释掉解决方法:●1、题目再读几遍,确认不是题目理解问题;然后考虑下你的算法是不是正确的;最后就是调式程序●2、注释掉文件读入(4) Time Limit Exceeded超时可能原因:●1、程序的算法复杂度太高●2、程序中出现死循环●3、文件读入没有结束(例如scanf()后面没有加EOF)解决方法:●1、改进算法,降低复杂度●2、调试程序,去掉死循环●3、加上EOF(5) Output Limit Exceeded输出过多可能原因:●1、答案错误●2、死循环●3、文件读入没有结束(例如scanf()后面没有加EOF)解决方法:●1、调试程序,排除错误●2、去掉死循环●3、加上EOF(6) Memory Limit Exceeded超内存可能原因:●1、程序分配的内存过多解决方法:●1、减少多余的内存消耗(7) Compile Error编译错误可能原因:●1、程序用了不支持的函数解决方法:●1、按照编译出错信息修改程序(8) Segmentation Fault段错误可能原因:●1、数组越界访问●2、堆栈溢出解决方法:●1、检查下数组开的够不够大或是太大;然后再看程序中有没有数组越界访问,比如a[-1]●2、修改程序,减少堆栈使用(9) Floating Point Error除0错可能原因:●1、程序中有地方除0解决方法:●1、检查程序,改掉除0的地方(10) Runtime Error运行时出错(8)和(9)的综合。
ACM-ICPC常见错误类型
ACM-ICPC常见错误类型1Presentation Error(PE)格式错误。
虽然您的程序貌似输出了正确的结果,但是这个结果的格式有点问题。
请检查程序的输出是否多了或者少了空格(’’)、制表符(’\t’)或者换行符(’\n’)。
2Wrong Answer(WA)答案错误。
这个一般认为是算法有问题。
3Time Limit Exceeded(TLE)超时。
您的程序运行的时间已经超出了这个题目的时间限制。
4Memory Limit Exceeded(MLE)超空间。
您的程序运行的内存已经超出了这个题目的内存限制。
5Output Limit Exceeded(OLE)输出量超极限。
您的程序输出内容太多,超过了这个题目的输出限制。
6Compilation Error(CE)编译错误。
您的程序语法有问题,编译器无法编译。
具体的出错信息可以点击链接查看。
7System Error(SE)系统错误。
OJ内部出现错误。
由于我们的OJ可能存在一些小问题,所以出现这个信息请原谅,同时请及时与管理员联系。
18Runtime Error(RE)运行时错误(程序崩溃)。
如下图所示:这个一般是程序在运行期间执行了非法的操作造成的。
以下列出常见的错误类型:8.1ACCESS_VIOLATION访问冲突。
您的程序想从一些非法的地址空间读取或向其中写入内容。
一般例如指针、数组下标越界都会造成这个错误的。
8.2ARRAY_BOUNDS_EXCEEDED数组界限超标。
您的程序试图访问一个超出硬件支持范围的数组单元。
8.3FLOAT_DENORMAL_OPERAND进行了一个非正常的浮点操作。
一般是由于一个非正常的浮点数参与了浮点操作所引起的,比如这个数的浮点格式不正确。
8.4FLOAT_DIVIDE_BY_ZERO浮点数除法出现除数为零的异常。
8.5FLOAT_OVERFLOW浮点上溢。
要表示的数太大,超出了浮点数的表示范围。
8.6FLOAT_UNDERFLOW浮点下溢。
2018ACM-ICPC南京区域赛题解
2018ACM-ICPC南京区域赛题解解题过程开场开A,A题shl看错题意,被制⽌。
然后开始⼿推A,此时byf看错E题题意,开始上机。
推出A的规律后,shl看了E题,发现题意读错。
写完A题,忘记判断N=0的情况,WA+1。
过了A后,shl重新写E,lfw开始开J题,E题过不了样例,lfw多次起⽴让shl调试,然后shl拿到E的⼀⾎,lfw之后过了J。
byf开始开I题,shl⼝胡出M做法,然后lfw和shl⼀起推G题。
byf过了I题后,shl推出G题,byf去写。
然后lfw开始计算⼏何,经过查错后过掉,然后shl开始开M题,过掉后还剩最后半⼩时,⽆题可做。
最后罚时很多,因为前期签到题过得太慢,A题40+分钟才过,J题1⼩时40分钟才过。
题解A - Adrien and Austin题解:给你n给⽯头,下标依次为1~n,然后两个⼈轮流取⽯头,每次取1~k个连续下标的⽯头,最后不能取得输掉⽐赛。
问你谁会获胜。
找规律,⾸先,n==0时,第⼀个⼈必败。
k==1时,n为奇数时先⼿必胜。
k>1时,先⼿必胜.参考代码:1 #include<bits/stdc++.h>2using namespace std;3 typedef long long LL;4const int mod=1e9+7;5 LL quick_pow(LL a,LL b)6 {7 LL ans=1;8while(b)9 {10if(b&1) ans=ans*a%mod;11 a=a*a%mod;12 b>>=1;13 }14return ans;15 }16int main()17 {18int t;19 scanf("%d",&t);20int l24=quick_pow(24,mod-2);21while(t--)22 {23int n;24 scanf("%d",&n);25 LL ans=1;26 ans=ans*n%mod;27 ans=ans*(n+1)%mod;28 ans=ans*(n+2)%mod;29 ans=ans*(n+3)%mod;30 ans=ans*l24%mod;31 printf("%lld\n",ans);32 }33 }View CodeB - TournamentUnsolved.C - Cherry and ChocolateUnsolved.D - Country Meow队友写的.题解:https:///liufengwei1/article/details/89303612参考代码:1 #include<bits/stdc++.h>2#define maxl 1103#define eps 1e-84struct point5 {6double x,y,z;7 point(double a=0,double b=0,double c=0)9 x=a;y=b;z=c;10 }11 };1213int npoint,nouter;14 point pt[maxl],outer[4],res;15double radius,tmp,ans;1617 inline double dist(point p1,point p2)18 {19double dx=p1.x-p2.x,dy=p1.y-p2.y,dz=p1.z-p2.z; 20return (dx*dx+dy*dy+dz*dz);21 }2223 inline double dot(point p1,point p2)24 {25return p1.x*p2.x+p1.y*p2.y+p1.z*p2.z;26 }2728 inline void ball()29 {30 point q[3];double m[3][3],sol[3],L[3],det;31int i,j;32 res.x=res.y=res.z=radius=0;33switch(nouter)34 {35case1: res=outer[0];break;36case2:37 res.x=(outer[0].x+outer[1].x)/2;38 res.y=(outer[0].y+outer[1].y)/2;39 res.z=(outer[0].z+outer[1].z)/2;40 radius=dist(res,outer[0]);41break;42case3:43for(int i=0;i<2;i++)44 {45 q[i].x=outer[i+1].x-outer[0].x;46 q[i].y=outer[i+1].y-outer[0].y;47 q[i].z=outer[i+1].z-outer[0].z;48 }49for(int i=0;i<2;i++)50for(int j=0;j<2;j++)51 m[i][j]=dot(q[i],q[j])*2;52for(int i=0;i<2;i++)53 sol[i]=dot(q[i],q[i]);54if(fabs(det=m[0][0]*m[1][1]-m[0][1]*m[1][0])<eps) 55return;56 L[0]=(sol[0]*m[1][1]-sol[1]*m[0][1])/det;57 L[1]=(sol[1]*m[0][0]-sol[0]*m[1][0])/det;58 res.x=outer[0].x+q[0].x*L[0]+q[1].x*L[1];59 res.y=outer[0].y+q[0].y*L[0]+q[1].y*L[1];60 res.z=outer[0].z+q[0].z*L[0]+q[1].z*L[1];61 radius=dist(res,outer[0]);62break;63case4:64for(int i=0;i<3;i++)65 {66 q[i].x=outer[i+1].x-outer[0].x;67 q[i].y=outer[i+1].y-outer[0].y;68 q[i].z=outer[i+1].z-outer[0].z;69 sol[i]=dot(q[i],q[i]);70 }71for(int i=0;i<3;i++)72for(int j=0;j<3;j++)73 m[i][j]=dot(q[i],q[j])*2;74 det=m[0][0]*m[1][1]*m[2][2]75 + m[0][1]*m[1][2]*m[2][0]76 + m[0][2]*m[2][1]*m[1][0]77 - m[0][2]*m[1][1]*m[2][0]78 - m[0][1]*m[1][0]*m[2][2]79 - m[0][0]*m[1][2]*m[2][1];80if(fabs(det)<eps) return;81for(int j=0;j<3;j++)82 {83for(int i=0;i<3;i++)84 m[i][j]=sol[i];85 L[j]=(m[0][0]*m[1][1]*m[2][2]86 +m[0][1]*m[1][2]*m[2][0]87 +m[0][2]*m[2][1]*m[1][0]88 -m[0][2]*m[1][1]*m[2][0]89 -m[0][1]*m[1][0]*m[2][2]90 -m[0][0]*m[1][2]*m[2][1])/det;91for(int i=0;i<3;i++)92 m[i][j]=dot(q[i],q[j])*2;93 }94 res=outer[0];95for(int i=0;i<3;i++)96 {98 res.y+=q[i].y*L[i];99 res.z+=q[i].z*L[i];100 }101 radius=dist(res,outer[0]);102 }103 }104105 inline void minball(int n)106 {107 ball();108if(nouter<4)109for(int i=0;i<n;i++)110if(dist(res,pt[i])-radius>eps)111 {112 outer[nouter]=pt[i];113 ++nouter;114 minball(i);115 --nouter;116if(i>0)117 {118 point Tt=pt[i];119 memmove(&pt[1],&pt[0],sizeof(point)*i);120 pt[0]=Tt;121 }122 }123 }124125 inline double smallest_ball()126 {127 radius=-1;128for(int i=0;i<npoint;i++)129if(dist(res,pt[i])-radius>eps)130 {131 nouter=1;132 outer[0]=pt[i];133 minball(i);134 }135return sqrt(radius);136 }137138 inline void prework()139 {140for(int i=0;i<npoint;i++)141 scanf("%lf%lf%lf",&pt[i].x,&pt[i].y,&pt[i].z);142 }143144 inline void mainwork()145 {146 ans=smallest_ball();147 }148149 inline void print()150 {151 printf("%.5f\n",ans);152 }153154int main()155 {156while(~scanf("%d",&npoint))157 {158 prework();159 mainwork();160 print();161 }162return0;163 }View CodeE - Eva and Euro coins题解:给你两个01串,然后连续k个0可以翻转为1,连续k个1可以翻转为0.问你这两个01串是否可以变成相同的串。
ACM-ICPC域赛是不是很水?
ACM/ICPC域赛是不是很水?这个问题一直以来都是程序员们热议的话题。
对于初学者来说,可能会觉得这个比赛很难,但对于一些资深选手来说,这个比赛却是很水的。
那么,ACM/ICPC域赛到底是不是很水呢?我们需要了解一下ACM/ICPC域赛的历史和背景。
ACM/ICPC域赛是ACM国际大学生程序设计竞赛的一个分站赛。
ACM国际大学生程序设计竞赛是一个世界性的大学生程序设计竞赛,始于1970年,由ACM(美国计算机协会)主办,是全球最具影响力的程序设计竞赛之一。
而ACM/ICPC域赛是ACM国际大学生程序设计竞赛的域赛,每年都会有数千支队伍参加。
我们需要了解一下ACM/ICPC域赛的考试内容和难度。
ACM/ICPC域赛的考试内容主要包括算法和数据结构。
这些内容对于计算机专业的学生来说是基础课程,但对于其他专业的学生来说可能需要花费更多的时间去学习。
难度方面,ACM/ICPC域赛的难度是比较高的,需要选手们具备较强的编程能力和解决问题的能力。
对于一些资深选手来说,这个比赛却是很水的,因为他们已经掌握了足够的算法和数据结构知识,并且有丰富的编程经验。
我们需要了解一下ACM/ICPC域赛的意义和价值。
ACM/ICPC域赛不仅仅是一场比赛,更是一种学习和交流的机会。
通过参加这个比赛,选手们可以学习到更多的算法和数据结构知识,提高自己的编程能力和解决问题的能力。
选手们还可以结识来自不同学校和不同国家的同学,交流彼此的经验和想法,拓展自己的视野和思维方式。
ACM/ICPC域赛不是很水,它需要选手们具备较强的编程能力和解决问题的能力。
对于一些资深选手来说,这个比赛却是很水的。
无论如何,ACM/ICPC域赛都是一场非常有意义和有价值的比赛,它可以帮助选手们提高自己的编程能力和解决问题的能力,同时也可以拓展选手们的视野和思维方式。
acm竞赛试题及答案
acm竞赛试题及答案ACM竞赛试题及答案1. 问题描述:给定一个整数数组,找出数组中没有出现的最小的正整数。
2. 输入格式:第一行包含一个整数n,表示数组的长度。
第二行包含n个整数,表示数组的元素。
3. 输出格式:输出一个整数,表示数组中没有出现的最小的正整数。
4. 样例输入:53 4 1 2 55. 样例输出:66. 问题分析:首先,我们需要理解题目要求我们找出数组中缺失的最小正整数。
这意味着我们需要检查数组中的每个元素,并确定最小的正整数是否在数组中。
7. 算法描述:- 遍历数组,使用一个哈希集合记录出现的数字。
- 从1开始,检查每个正整数是否在哈希集合中,直到找到不在集合中的最小正整数。
8. 代码实现:```pythondef find_missing_positive(nums):seen = set()for num in nums:if num <= 0:continuewhile num in seen or num > len(nums):num += 1seen.add(num)return min(set(range(1, len(nums) + 1)) - seen)```9. 测试用例:- 输入:[3, 4, -1, 1]- 输出:210. 答案解析:在给定的测试用例中,数组[3, 4, -1, 1]中没有出现的最小正整数是2。
这是因为-1不是正整数,所以可以忽略。
数组中已经出现了1和3,所以下一个最小的正整数就是2。
11. 注意事项:- 确保数组中的元素是整数。
- 考虑数组中可能包含0或负数的情况。
- 算法的时间复杂度应尽可能低。
12. 扩展思考:- 如果数组非常大,如何优化算法?- 如果数组中的元素可以是浮点数,算法应该如何修改?13. 参考答案:- 针对大数组,可以考虑使用更高效的数据结构,如平衡二叉搜索树。
- 如果元素是浮点数,需要先将其转换为整数,然后再进行处理。
2018ACM-ICPCWorldFinals部分题题解
2018ACM-ICPCWorldFinals部分题题解Problem C. Conquer the World &&loj6405 征服世界题⽬⼤意:给定⼀棵树,树有边权。
每个点上有a_i个⼠兵,且每个点最终需要b_i个⼠兵。
求最⼩代价。
n\leq2.5*10^5,a_i,b_i\leq1e9。
题解:显然,我们可以直接⽤这棵树跑费⽤流。
但n太⼤了。
所以我们只能模拟⼀下费⽤流的过程了。
⾸先,为了保证所有的b_i都能选满,我们先给每个b_i加⼀个-INF的权值。
考虑维护两个堆,分别记录a的信息和b的信息。
DFS这棵树,设当前节点为u。
将u的所有⼉⼦的堆全部合并,每个点的初始权值是dis_i和dis_i-INF,指的是i到1号节点的距离。
这个可以⽤左偏树或者stl⾥的pb_ds实现。
将⼦树信息上传完成后,开始尝试将它们两两配对。
配对终⽌的条件是两个堆顶元素匹配的权值\geq 0。
然后考虑如何像费⽤流那样进⾏反悔操作。
如果当前的⼀个匹配点和另外⼀个点匹配了,那么就要撤销之前的匹配。
列出两次匹配的关系式,我们就可以分别得出计算a,b反悔代价的算式。
因为⼀个点的a和b不会同时反悔,且\sum b_i也不⼤,所以做法是正确的。
具体的反悔实现可以看我的代码。
时间复杂度:O(nlogn)代码:#include<bits/stdc++.h>using namespace std;#define re register int#define F(x,y,z) for(re x=y;x<=z;x++)#define FOR(x,y,z) for(re x=y;x>=z;x--)typedef long long ll;#define I inline void#define IN inline int#define C(x,y) memset(x,y,sizeof(x))#define STS system("pause")template<class D>I read(D &res){res=0;register D g=1;register char ch=getchar();while(!isdigit(ch)){if(ch=='-')g=-1;ch=getchar();}while(isdigit(ch)){res=(res<<3)+(res<<1)+(ch^48);ch=getchar();}res*=g;}const ll INF=1e12+7;struct E{int to,nt,w;}e[505000];#define T e[k].toqueue<int>q;struct Dat{ll w,f;Dat(ll _w=0,ll _f=0){w=_w;f=_f;}friend bool operator < (Dat x,Dat y){return x.w>y.w;}}d[2000000];int now,cnt,ch[2000000][2],dis[2000000],root[303000],rt[303000];int n,m,X,Y,W,a[303000],b[303000],head[303000],tot,sum;ll dep[303000],ans;IN new_node(){re res;if(q.empty())return ++cnt;res=q.front();q.pop();ch[res][0]=ch[res][1]=dis[res]=d[res].w=d[res].f=0;return res;}I add(int x,int y,int w){e[++tot].to=y;e[tot].nt=head[x];head[x]=tot;e[tot].w=w;}IN merge(int x,int y){if(!x||!y)return x+y;if(d[x]<d[y])swap(x,y);ch[x][1]=merge(ch[x][1],y);if(dis[ch[x][0]]<dis[ch[x][1]])swap(ch[x][0],ch[x][1]);dis[x]=dis[ch[x][1]]+1;return x;}I D_1(int x,int fa,ll depth){dep[x]=depth;if(a[x])d[x]=Dat(dep[x],a[x]),root[x]=x,dis[x]=0;else root[x]=0;if(b[x])d[x+n]=Dat(dep[x]-INF,b[x]),rt[x]=x+n,dis[x+n]=0;else rt[x]=0;for(re k=head[x];k!=-1;k=e[k].nt){if(T==fa)continue;D_1(T,x,depth+e[k].w);root[x]=merge(root[x],root[T]);rt[x]=merge(rt[x],rt[T]);}while(root[x]&&rt[x]&&d[root[x]].w+d[rt[x]].w-2*dep[x]<0){ll vala=d[root[x]].w,valb=d[rt[x]].w,tmp=min(d[root[x]].f,d[rt[x]].f),nowa=d[root[x]].f-tmp,nowb=d[rt[x]].f-tmp;ans+=(vala+valb-2*dep[x])*tmp;q.emplace(root[x]);q.emplace(rt[x]);//cout<<"!"<<root[x]<<" "<<rt[x]<<" "<<tmp<<" "<<vala<<" "<<valb<<" "<<dep[x]<<" "<<nowa<<" "<<nowb<<endl;root[x]=merge(ch[root[x]][0],ch[root[x]][1]);rt[x]=merge(ch[rt[x]][0],ch[rt[x]][1]);if(tmp){now=new_node();d[now]=Dat(2*dep[x]-valb,tmp);dis[now]=0;root[x]=merge(root[x],now);now=new_node();d[now]=Dat(2*dep[x]-vala,tmp);dis[now]=0;rt[x]=merge(rt[x],now);}if(nowa)now=new_node(),d[now]=Dat(vala,nowa),dis[now]=0,root[x]=merge(root[x],now);if(nowb)now=new_node(),d[now]=Dat(valb,nowb),dis[now]=0,rt[x]=merge(rt[x],now);}}int main(){read(n);C(head,-1);tot=-1;cnt=n<<1;dis[0]=-1;F(i,1,n-1){read(X);read(Y);read(W);add(X,Y,W);add(Y,X,W);}F(i,1,n){read(a[i]),read(b[i]);re tmp=min(a[i],b[i]);a[i]-=tmp;b[i]-=tmp;sum+=b[i];}D_1(1,0,0);/*while(rt[1]){ll vala=d[root[1]].w,valb=d[rt[1]].w,tmp=min(d[root[1]].f,d[rt[1]].f),nowa=d[root[1]].f-tmp,nowb=d[rt[1]].f-tmp;ans+=(vala+valb-2*dep[1])*tmp;//cout<<"!"<<tmp<<endl;root[1]=merge(ch[root[1]][0],ch[root[1]][1]);rt[1]=merge(ch[rt[1]][0],ch[rt[1]][1]);if(nowa)++now,d[now]=Dat(vala,nowa),dis[now]=0,root[1]=merge(root[1],now);if(nowb)++now,d[now]=Dat(valb,nowb),dis[now]=0,rt[1]=merge(rt[1],now);//cout<<now<<endl;}*/printf("%lld",ans+(ll)INF*sum);return 0;}/*31 2 53 1 52 15 01 361 2 21 3 51 4 12 5 52 6 10 01 02 12 10 10 1*/Problem I. Triangles && loj6411题⽬⼤意:给出⼀张毒瘤的图,求其中包含的三⾓形个数。
acm大赛试题及答案
acm大赛试题及答案ACM大赛试题及答案1. 题目一:字符串反转问题描述:编写一个程序,输入一个字符串,输出其反转后的字符串。
输入格式:输入包含一个字符串,字符串长度不超过100。
输出格式:输出反转后的字符串。
示例:输入:hello输出:olleh答案:```pythondef reverse_string(s):return s[::-1]input_string = input().strip()print(reverse_string(input_string))```2. 题目二:计算阶乘问题描述:编写一个程序,输入一个非负整数n,输出n的阶乘。
输入格式:输入包含一个非负整数n,n不超过20。
输出格式:输出n的阶乘。
示例:输入:5输出:120答案:```pythondef factorial(n):if n == 0:return 1else:return n * factorial(n - 1)n = int(input())print(factorial(n))```3. 题目三:寻找最大数问题描述:给定一个包含n个整数的数组,找出数组中的最大数。
输入格式:输入包含一个整数n,表示数组的大小,随后是n个整数。
输出格式:输出数组中的最大数。
示例:输入:5 1 2 3 4 5输出:5答案:```pythonn = int(input())numbers = list(map(int, input().split()))max_number = max(numbers)print(max_number)```4. 题目四:判断闰年问题描述:编写一个程序,输入一个年份,判断该年份是否为闰年。
输入格式:输入包含一个整数,表示年份。
输出格式:如果输入的年份是闰年,则输出"Yes",否则输出"No"。
示例:输入:2000输出:Yes答案:```pythonyear = int(input())if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):print("Yes")else:print("No")```5. 题目五:斐波那契数列问题描述:编写一个程序,输入一个非负整数n,输出斐波那契数列的第n项。
acm竞赛知识点
ACM竞赛知识点简介ACM竞赛是指由国际大学生程序设计竞赛(ACM-ICPC)组织的一系列编程比赛。
ACM竞赛旨在培养学生的计算机科学和编程能力,提高解决实际问题的能力和团队合作精神。
本文将介绍ACM竞赛的基本知识点和技巧,帮助读者更好地了解和参与这一竞赛。
知识点1. 数据结构在ACM竞赛中,数据结构是解决问题的关键。
以下是一些常用的数据结构:•数组:用于存储一组相同类型的数据。
•链表:用于存储和操作具有相同数据类型的元素。
•栈:一种后进先出(LIFO)的数据结构。
•队列:一种先进先出(FIFO)的数据结构。
•树:一种非线性的数据结构,由节点和边组成。
•图:一种由节点和边组成的数据结构,用于表示各种关系。
2. 算法ACM竞赛中常用的算法包括:•排序算法:如快速排序、归并排序、堆排序等,用于将数据按照一定的规则进行排序。
•查找算法:如二分查找、哈希表等,用于在数据中查找指定的元素。
•图算法:如深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径算法等,用于解决图相关的问题。
•动态规划:一种将复杂问题分解为简单子问题的方法,用于解决多阶段决策问题。
•贪心算法:一种每一步都选择当前最优解的方法,用于解决优化问题。
3. 数学数学在ACM竞赛中扮演着重要的角色。
以下是一些常用的数学知识点:•组合数学:包括排列组合、二项式定理、卡特兰数等,用于计算对象的排列和组合方式。
•数论:包括素数、最大公约数、最小公倍数等,用于解决与整数相关的问题。
•概率与统计:包括概率分布、统计推断等,用于分析和预测事件发生的概率。
•矩阵与线性代数:用于解决与矩阵和线性方程组相关的问题。
4. 字符串处理在ACM竞赛中,字符串处理是常见的问题之一。
以下是一些常用的字符串处理技巧:•字符串匹配:如KMP算法、Boyer-Moore算法等,用于在一个字符串中查找另一个字符串。
•字符串排序:如字典序排序、后缀数组等,用于对字符串进行排序。
国际大学生程序设计大赛(ACMICPC)简介及竞赛样题
国际大学生程序设计大赛(ACMICPC)简介及竞赛样题附件二国际大学生程序设计大赛(ACM/ICPC)简介相关情况简介一>、历届ACM-ICPC亚洲预选赛中国内地部分赛区参赛情况二>、历届ACM-ICPC全球总决赛中国内地高校获奖情况注:***金牌,**银牌,*铜牌;--表示未参加上一年的地区预赛,/ 表示上一年的地区预赛未能出线。
ACM/ICPC大赛简介ACM/ICPC (ACM International Collegiate Programming Contest, 国际大学生程序设计竞赛)是由国际计算机界历史悠久、颇具权威性的组织ACM(Association for Computing Machinery,国际计算机协会)主办的,是世界上公认的规模最大、水平最高的国际大学生程序设计竞赛,是一项旨在展示大学生创新能力、团队精神和在压力下编写程序、分析和解决问题能力的年度竞赛。
其目的旨在使大学生运用计算机来充分展示自己分析问题和解决问题的能力。
该项竞赛从1970年至今已举办了34届,受到国际各知名大学的普遍重视,并受到全世界各著名计算机公司的高度关注,是信息企业与世界顶尖计算机人才对话的最好机会。
ACM国际大学生程序设计竞赛已成为世界各国大学生最具影响力的国际计算机类的赛事,是广大爱好计算机编程的大学生展示才华的舞台,是各个大学计算机教育成果的直接体现。
在过去十几年中,世界著名信息企业APPLE、AT&T、MICROSOFT和IBM分别担任了竞赛的赞助商。
中国大陆高校从1996年开始参加ACM/ICPC亚洲预赛,主要是各个重点院校。
该项竞赛分为区域预赛和国际决赛两个阶段进行,各预赛区第一名自动获得参加世界决赛的资格,世界决赛安排在每年的3~4月举行,而区域预赛安排在上一年的9~12月在各大洲举行。
ACM/ICPC的区域预赛是规模很大、范围很广的赛事,但历届河南省各高校却极少组队参加,为了提升和检验河南省计算机教育水平,河南省计算机学会从2008年开始,在河南省推广开展ACM国际大学生程序设计竞赛,为广大的爱好计算机编程的大学生提供展示才华的舞台,为河南省各高校组队参加ACM/ICPC的区域预赛的提供实战的场地,并以此为契机推动河南省计算机教育水平的提高。
ACM校赛比赛题目及分析
Problem A -- 超级难题Time Limit:1000ms Memory Limit:65535KBDescriptionACM程序设计大赛是大学级别最高的脑力竞赛,素来被冠以"程序设计的奥林匹克"的尊称。
大赛自1970年开始至今已有30年历史,是世界范围内历史最悠久、规模最大的程序设计竞赛。
比赛形式是:经过校级和地区级选拔的参赛组,于指定的时间、地点参加世界级的决赛,由3个成员组成的小组应用一台计算机解决6到8个生活中的实际问题。
参赛队员必须在5小时内编完程序并进行测试和调试。
此种大赛对参赛学生的逻辑分析能力、策略制定和脑力方面具有极大的挑战性。
大赛提倡在压力较大的情况下,培养学生的创造力、团队合作精神以解决竞赛的问题,从而挑选和发掘世界上最优秀的程序设计人才竞赛的历史可以上溯到1970年,当时在美国德克萨斯A&M大学举办了首届比赛。
当时的主办方是the Alpha Chapter of the UPE Computer Science Honor Society。
作为一种全新的发现和培养计算机科学顶尖学生的方式,竞赛很快得到美国和加拿大各大学的积极响应。
1977年,在ACM计算机科学会议期间举办了首次总决赛,并演变成为目前的一年一届的多国参与的国际性比赛。
迄今已经举办了29届ACM/ICPC以团队的形式代表各学校参赛,每队由3名队员组成。
每位队员必须是入校5年内的在校学生。
比赛期间,每队使用1台电脑需要在5个小时内使用C、C++、Pascal或Java中的一种编写程序解决8或10个问题。
程序完成之后提交裁判运行,并把运行结果及时通知参赛队。
而且有趣的是每队在正确完成一题后,组织者将在其位置上升起一只代表该题颜色的气球2009年的时候队伍A参加了ACM的区域赛,那次区域赛比赛总共有N个题,队伍A做了N个题中的M个。
队伍A 做第一题所用的时间为T1分钟,做第一题所用的时间为T2分钟,.......做第M题所用的时间为Tm分钟。
第三十届ACMICPC 世界总决赛题目解析
第三十届ACM/ICPC 世界总决赛题目解析斯坦福大学王颖本次比赛的题目请见/icpc/Finals/2006WorldFinalProblemSet.pdf Problem A本题的大意是,给出一些机票,每个机票都是一条路线,比如城市A->城市B->城市K->…->城市N,并且每张机票有一个价格。
我们可以只用一张机票的一部分,比如城市A->城市B->城市K,然后就丢弃这张机票。
但有两个条件,第一,必须在机票的起始城市才能使用机票,也就是说,我们不能用上面的机票从城市B到城市K;第二,如果使用了一张机票的部分,以后就不能使用剩下的部分。
现在给出一条路线,我们要按顺序访问一系列的城市。
给出所有可以购买的机票,每种机票可以买无限张,问怎样可以用最少的花费完成整个旅途。
本题的数据规模颇小,机票最多20种,而每个机票最多经过10个城市。
由于机票可以重复购买,城市必须按顺序经过,很容易想到要用动态规划。
但从比赛过程中可以发现,无数的队伍被这题卡住了,而且很少的队伍能够一次通过。
问题就在于,并不是只能访问指定路径上的城市,而是可以访问一些辅助的城市来减小花费。
所以,我们要用一个二元组(i,j)来表示一个状态。
其中i表示指定路径上已经按顺序访问了的城市数量,j表示当前所在城市。
通过机票的信息,不难得到状态之间的一个有向图,而我们要求的其实就是一个最短路径。
注意到这个图是有圈的,所以我们不能直接用动态规划,而是需要用最短路算法。
本题初看觉得规模甚小,此时则可以发现最多能有20*10=200个城市,共可以有10*200=2000个状态,还是颇有规模的。
总结:想清楚后此题并不复杂。
但比赛时必须保持头脑清醒,分析清楚题意,才可能顺利解决此题。
比赛中虽然很多队伍做出此题,但很少有队伍一次做对,更有一些队伍一直困在这题,可见比赛中队伍普遍紧张,没能仔细的去考虑。
Problem B典型的最小费用最大流,不多说了。
ACM竞赛规则与常见
ACM/ICPC竞赛常见问题解答参赛对象1、凡广州大学在校本专科生均可报名参加。
年级、专业不限。
鼓励低年级同学及女同学参加。
2、本次比赛学生以个人身份参加,每人独立参赛。
3、参赛同学应保证自己身份等资料的真实性。
竞赛细则1、选手在参赛时携带个人证件。
2、竞赛以上机为比赛方式。
3、竞赛中至少命题6题,至多命题9题,上机比赛时间为4个小时,中间不休息。
4、参赛选手可以携带诸如书籍、字典、手册、程序清单等文字性参考资料。
5、参赛选手不能携带任何可用计算机处理的软件或数据(不允许任何私人携带的磁盘或计算器)。
6、参赛选手不能携带任何类型的通讯工具,包括无线电接收器、移动电话等。
7、选手未解决全部题目不得提前离场8、竞赛的预定时间为4小时,但当竞赛进行一定时间后,竞赛裁判可以因为出现不可预见的事件而调整比赛时间长度,一旦比赛时间长度发生改变,将会以及时并且统一的方式通告所有参赛选手。
9、当参赛选手出现妨碍比赛正常进行的行为时,诸如擅自移动赛场中的设备,未经授权修改比赛软硬件,干扰他人比赛等,都将会被竞赛裁判剥夺参赛资格。
竞赛评分1、正确解答中等数量以上试题的队伍会根据解题数目进行排名,解题数在中等数量以下的队伍只发布解题数量,不进行排名。
2、在进行排名时,如果多人解题数量相同,则根据总用时加上惩罚时间进行排名。
总用时和惩罚时间由每道解答正确的试题的用时之和加上惩罚时间之和而成。
每道试题用时将从竞赛开始到试题解答被判定为正确为止,期间每一次错误的运行将被加罚20分钟时间。
未正确解答的试题不记时,对应的错误运行也不计入惩罚时间。
3、选手在比赛期间能看到排名表和他人的成绩、解决的问题。
4、比赛中每一道题目对应一种颜色的气球(颜色的对应在试题中注明)。
在选手正确解答出某道题目后,工作人员将会把对应颜色的气球插到此同学的位置旁。
5、比赛结束前一个小时内,将不再为正确的解答摆放气球。
6、请注意竞赛裁判决定解答提交是否正确需要一定的时间。
2020ICPC济南站部分题解
2020ICPC济南站部分题解A题看出独⽴性后⾼斯消元#include<bits/stdc++.h>using namespace std;#define ll long longconst int N=205;int a[N][N];//增⼴矩阵int x[N];//解集int freeX[N];//⾃由变元int Gauss(int equ,int var){//返回⾃由变元个数/*初始化*/for(int i=0;i<=var;i++){x[i]=0;freeX[i]=0;}/*转换为阶梯阵*/int col=0;//当前处理的列int num=0;//⾃由变元的序号int row;//当前处理的⾏for(row=0;row<equ&&col<var;row++,col++){//枚举当前处理的⾏int maxRow=row;//当前列绝对值最⼤的⾏for(int i=row+1;i<equ;i++){//寻找当前列绝对值最⼤的⾏if(abs(a[i][col])>abs(a[maxRow][col]))maxRow=i;}if(maxRow!=row){//与第row⾏交换for(int j=row;j<var+1;j++)swap(a[row][j],a[maxRow][j]);}if(a[row][col]==0){//col列第row⾏以下全是0,处理当前⾏的下⼀列freeX[num++]=col;//记录⾃由变元row--;continue;}for(int i=row+1;i<equ;i++){if(a[i][col]!=0){for(int j=col;j<var+1;j++){//对于下⾯出现该列中有1的⾏,需要把1消掉a[i][j]^=a[row][j];}}}}/*求解*///⽆解:化简的增⼴阵中存在(0,0,...,a)这样的⾏,且a!=0for(int i=row;i<equ;i++)if(a[i][col]!=0)return -1;//⽆穷解: 在var*(var+1)的增⼴阵中出现(0,0,...,0)这样的⾏int temp=var-row;//⾃由变元有var-row个if(row<var)//返回⾃由变元数return temp;//唯⼀解: 在var*(var+1)的增⼴阵中形成严格的上三⾓阵for(int i=var-1;i>=0;i--){//计算解集x[i]=a[i][var];for(int j=i+1;j<var;j++)x[i]^=(a[i][j]&&x[j]);}return 0;}int A[N][N],B[N][N];ll ksm(ll x,ll y,ll m){ll res=1;while(y){if(y&1)res=res*x%m;x=x*x%m;y>>=1;}return res;}int main(void){for(int j=0;j<n;j++)scanf("%d",&A[i][j]);}for(int i=0;i<n;i++){for(int j=0;j<n;j++)scanf("%d",&B[i][j]);}long long ean=0;for(int i=0;i<n;i++){for(int j=0;j<n;j++){for(int k=0;k<n;k++){if(j==k)a[j][j]=A[j][j]^B[j][i];else a[j][k]=A[j][k];}}int freeNum=Gauss(n,n);//获取⾃由元if(freeNum == -1) continue;else ean+=freeNum;}cout<<ksm(2ll,ean,1ll*998244353);return 0;}View CodeC题答案和3⽆关,只要考虑1和2的相对⼤⼩求解即可#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef pair<int,int> pll;const int N=1e6+10;ll a[N];int main(){ios::sync_with_stdio(false);int i;ll ans=0;for(i=1;i<=3;i++){cin>>a[i];}if(a[1]>=a[2]){ans+=2*a[2];a[1]-=a[2];ans+=3*(a[1]/3);if(a[1]%3==2){ans+=1;}cout<<ans<<endl;}else{ans+=2*a[1];a[2]-=a[1];ans+=6*(a[2]/3);if(a[2]%3==2){ans+=4;}cout<<ans<<endl;}return 0;}View CodeD题刚开始是全部取右边,因此我们排序后控制⾃⼰的位置不能⼩于前⾯⼀个⼈的位置,在这种情况下取最⼩#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef pair<int,int> pll;const int N=1e6+10;int l[N],r[N];struct node{int x,low;bool operator <(const node &t) const{if(x!=t.x)return x<t.x;return low>t.low;}}s[N];ios::sync_with_stdio(false);int i;int n;cin>>n;for(i=1;i<=n;i++){cin>>l[i]>>r[i];s[i].x=r[i];s[i].low=l[i];}ll ans=0;for(i=1;i<=n;i++){ans+=s[i].x;}sort(s+1,s+1+n);int lst;for(i=1;i<=n;i++){int tmp=0;if(i==1){tmp=s[i].x-s[i].low;lst=s[i].low;ans-=tmp;continue;}if(s[i].x==s[i-1].x){tmp=min(s[i].x-s[i].low,s[i].x-lst);}else{tmp=min(s[i].x-s[i].low,s[i].x-lst);}ans-=tmp;lst=s[i].x-tmp;}cout<<ans<<endl;return 0;}View CodeG题签到题#include<bits/stdc++.h>using namespace std;#define LL long longint main(){LL x,y;LL sum=1;scanf("%lld %lld\n",&x,&y);while(sum<=x){sum*=2;}sum--;printf("2\n");printf("%lld %lld\n",sum^x,sum^y);return 0;}View CodeL题数位dp,观察求的是1的个数,⽽⼀个进位会影响到前⾯连续的1,因此我们要保留连续1的奇偶性,并且要保留全部1的奇偶性,但是这样还是没法,数据量依旧⼤这个时候我们发发现因为m很⼩,所以只需要后7位就能记录所有相加的可能性,⽽只产⽣⼀个进位,因此对于后7位暴⼒计算,⽽只保留第七位往前的信息,这样复杂度就能过了这样只会计算64*128*2*2*2左右的状态#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef pair<ll,int> pll;const int N=1e6+10;const ll mod=998244353;ll f[65][128][2][2][2];int a[N];int cal(int sta,int pre,int tot){int res=1;for(int i=0;i<m;i++){if(sta+i<128){res&=((__builtin_parity(sta+i)^tot)==a[i]);}else{res&=((__builtin_parity(sta+i)^pre^tot)==a[i]);}}return res;}ll dfs(int u,int sta,int sign,int pre,int tot){if(u==-1)return cal(sta,pre,tot);auto &x=f[u][sta][sign][pre][tot];if(x!=-1)return x;int up=1;if(sign)up=s[u];ll res=0;for(int i=0;i<=up;i++){if(u>6){res+=dfs(u-1,(sta*2+i)&127,sign&&(i==up),i&(!pre),tot^i); }else{res+=dfs(u-1,(sta*2+i)&127,sign&&(i==up),pre,tot);}}x=res;return x;}ll solve(ll n){cnt=0;memset(f,-1,sizeof f);if(n==0){s[cnt++]=0;}while(n){s[cnt++]=n&1;n/=2;}return dfs(cnt-1,0,1,0,0);}int main(){ios::sync_with_stdio(false);int t;cin>>t;while(t--){cin>>m>>n;for(int i=0;i<m;i++){cin>>a[i];}cout<<solve(n)<<endl;}return 0;}View CodeM题签到题#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef pair<int,int> pll;const int N=1e6+10;int main(){ios::sync_with_stdio(false);int n,k;cin>>n>>k;if(n<=k){cout<<2<<endl;return 0;}n*=2;}else{cout<<n/k<<endl; }return 0;}View Code。
ACM--ICPC--重要补充知识
三 分离集合的森林
分离集合的另一种更快的实现是用有根树来表示集合:每棵树表示一个集合,树 中的节点对应一个人。图示出了一个分离集合的森林。 图 0-0-3 每个节点 x 包含这些信息:父节点指针 p[x] ,树的深度 rank[x] 。其中 rank[x] 将用于启发式合并过程。 于是建立集合过程的时间复杂度依然为 O(1) 。 SUB-Make-Set(x) 20 p[x] ← x 21 rank[x] ← 0 用森林的数据结构来实现的最大好处就是降低 SUB-Union(a,b) 过程的时间复杂 度。 SUB-Union(a,b) 22 SUB-Link(SUB-Find-Set(a),SUB-Find-Set(b)) SUB-Link(a,b) 23 p[a] ← b 合并集合的工作只是将 a 所在树的根节点的父节点改为 b 所在树的根节点。这个 操作只需 O(1) 的时间。而 SUB-Union(a,b) 的时间效率决定于 SUB-Find-Set(x) 的快 慢。 SUB-Find-Set(x) 24 if x=p[x] 25 then return x 26 else return SUB-Find-Set(p[x]) 这个过程的时效与树的深度成线性关系,因此其平均时间复杂度为 O(logN) ,但 在最坏情况下(树退化成链表),时间复杂度为 O(N) 。于是 PROBLEM-Relations 最坏 情况的时间复杂度为 O(N(M+Q)) 。有必要对算法进行优化。
文档
实用标准文案
第一个优化是启发式合并。在优化单链表时,我们将较短的表链到较长的表尾, 在这里我们可以用同样的方法,将深度较小的树指到深度较大的树的根上。这样可以 防止树的退化,最坏情况不会出现。 SUB-Find-Set(x) 的时间复杂度为 O(log N) , PROBLEM-Relations 时间复杂度为 O(N + logN (M+Q)) 。 SUB-Link(a,b) 作相应改动。 SUB-Link(a,b) 27 if rank[a]>rank 28 then p ← a 29 else p[a] ← b 30 if rank[a]=rank 31 then rank ← rank+1 然而算法的耗时主要还是花在 SUB-Find-Set(x) 上。 第二个优化是路径压缩。它非常简单而有效。如图所示,在 SUB-Find-Set(1) 时, 我们“顺便”将节点 1, 2, 3 的父节点权改为节点 4 ,以后再调用 SUB-Find-Set(1) 时就只需 O(1) 的时间。 图 0-0-4 于是 SUB-Find-Set(x) 的代码改为: SUB-Find-Set(x) 32 if x?p[x] 33 then p[x] ← SUB-Find-Set(p[x]) 34 return p[x] 该过程首先找到树的根, 然后将路径上的所有节点的父节点改为这个根。 实现时, 递归的程序有许多栈的操作,改成非递归会更快些。 SUB-Find-Set(x) 35 r ← x 36 while r?p[r] 37 do r ← p[r] 38 while x?r 39 do q ← p[x] 40 p[x] ← r 41 x ← q 42 return r 改进后的算法时间复杂度的分析十分复杂,如果完整的写出来足可写一节,这里 我们指给出结论:改进后的 PROBLEM-Relations 其时间复杂度为 O(N+(M+Q)??(M+Q,N)) ,其中 ?(M+Q,N) 为 Ackerman 函数的增长极为缓慢的逆函数。你 不必了解与 Ackerman 函数相关的内容,只需知道在任何可想象得到的分离集合数据 结构的应用中, ?(M+Q,N) ? 4 ,因此 PROBLEM-Relations 的时间复杂度可认为是线性 的 O(N+M+Q) 。 解 (略 )
2020大一个人赛(10)题解2018-2019ACM-ICPCPacificNorthw。。。
2020⼤⼀个⼈赛(10)题解2018-2019ACM-ICPCPacificNorthw。
2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1)部分题A - Exam题意:给你k(朋友正确个数)和两个字符串(你和你朋友的答案),问你能答对的最⼤个数思路:找你和朋友相同的个数,然后进⾏判断就⾏。
1 #include<iostream>2 #include<algorithm>3 #include<vector>4 #include<map>5 #include<cstring>6using namespace std;7#define ll long long8const int N = 2e6+25;9const int mod = 1e9 + 7;10 ll a[N];11int main()12 {13 ll n, ans = 0, sum = 0;14 cin >> n;15string s1, s2;16 cin >> s1 >> s2;17for (int i = 0; i < s1.size(); i++)18 {19if (s1[i] == s2[i])20 ans++;21else22 sum++;23 }24if (ans == n)25 cout << s1.size() << endl;26else if (ans > n)27 cout << n + sum << endl;28else cout << s1.size() - (n - ans) << endl;29303132 }B - Coprime Integers题意:给你区间【a,b】【c,d】,问你互质整数对的数量。
20112011年ACM-ICPC协会程序设计大赛解题报告
Sample Output
ZOJZOJOJ ZOJZOJZOJZOO ZOJOJO
Problem1 : ZOJ
Analysis
要将字符串按照 ZOJ 的顺序输出,只需要记 录字符 ‘Z’、’O’、’J’ 各自在字符串中出现的 次数即可。
Problem1 : ZOJ
Solution
1. 输入字符串; 2. 分析字符串,分别记录字符 ‘Z’ , ‘O’ , ‘J’ 出现的次数; 3. 输出结果。
Problem2 : 畅通工程
Output
对每个测试用例,在1行里输出最少还需要建设的道路数目。
Problem2 : 畅通工程
Sample Input
42 13 43 33 12 13 23 52 12 35 999 0 0
Sample Output
1 0 2 998
Problem2 : 畅通工程
Problem1 : ZOJ
Input
题目包含多组用例,每组用例占一行,包含ZOJ三个字符,当输入“E”时表示输入结束。 1<=length<=100。
Output
对于每组输入,请输出一行,表示按照要求处理后的字符串。 具体可见样例。
Problem1 : ZOJ
Sample Input
ZZOOOJJJ ZZZZOOOOOJJJ ZOOOJJ E
Problem2 : 畅通工程
Input
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目( N < 1000 ) 和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接 连通的两个城镇的编号。为简单起见,城镇从1到N编号。 注意:两个城市之间可以有多条道路相通,也就是说 33 12 12 21 这种输入也是合法的 当N为0时,输入结束,该用例不被处理。
icpc程序设计题解
icpc程序设计题解
ICPC(国际大学生程序设计竞赛)是一个世界范围内的大型程序设计竞赛,旨在鼓励大学生在团队中解决现实世界中的问题。
ICPC竞赛题目通常涉及算法、数据结构、图论、动态规划等计算机科学领域的知识。
由于竞赛题目的复杂性和多样性,题解也会因题目而异。
在这里,我将就ICPC程序设计题解的一般性方法和技巧进行讨论。
首先,对于ICPC竞赛题目,理解题目要求至关重要。
通常情况下,你需要仔细阅读题目,理解问题的背景、输入输出格式以及具体要求。
其次,对于题目中涉及的算法和数据结构,需要有一定的了解和掌握。
例如,常见的算法包括贪心算法、分治算法、动态规划等,常见的数据结构包括栈、队列、堆、树等。
掌握这些基本算法和数据结构对于解题至关重要。
在解题过程中,需要灵活运用各种算法和数据结构的知识,结合题目要求,设计合适的解题思路。
在实际编码实现过程中,需要注重代码的效率和可读性。
合理选择数据结构和算法,避免不必要的计算和内存开销,是解题的关键。
此外,ICPC竞赛通常要求参赛者在有限的时间内解决多个题目,因此团队合作和高效的编程能力也是非常重要的。
在解题过程中,
合理分工、相互协作,可以提高解题效率。
总之,ICPC程序设计题解涉及广泛的计算机科学知识和编程技能,需要对算法、数据结构等有深入的理解和掌握,同时需要灵活
运用这些知识解决实际问题。
团队合作和高效的编程能力也是成功
解题的关键。
希望这些信息能对你有所帮助。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
A:在系统中,为管理资源,对每个程序的输出数量是有限制的。出现这种情况,一般都是因为程序中错误地出现了死循环,不断输出一些错误结果。
Q:Wrong Answer(结果错)是什么含义?
A:这是一种最常见的错误,也就是说明你的程序的计算出的结果不对。如果你在本地测试正确,则要注意到判决时所使用的可能是各种符合要求的数据,需要考虑你的算法是否考虑到了所有情况。
A:这说明你的程序在服务器上出现编译错误,请查看详细信息确定错误的具体内容。并请检查提交时是否选择了正确的语言。
Q:Runtime Error(运行错)是什么含义?
A:这说明你的程序在运行期间出现了某些错误。常见的错误包括:除零错误,数组越界,指针指向的单元不存在等。还有一种可能就是在C/C++中,main函数的返回值不是0。
Q:Time Over(超时)是什么含义?
A:每一个题目都有一个最大运行时间的要求(在试题中明确标出),如果你的程序的运行时间超过这个要求,将被强制停止,并返回这个错误。这种情况可能是由于程序中错误地出现了死循环,也可能是因为你的算法不够优化,这就需要重新设计算法和数据结构。
Q:Output Too Much(输出过多)是什么含义?
int j;
for (j=0; j<10; j++){…}
j=10;
Q:C/C++中,如下的错误信息是什么含义?
the `gets' function is dangerous and should not be used
A:gets函数作为一个危险的函数,可以造成系统的漏洞,因此不建议使用。如果要读取一行字符,可以使用cin.getline();
Q:如果一道题目,我反复提交都不对该怎么办?
A:有的时候,换一道题,换个思路也许会更好。
Q:我什么时候提交一道题目?
A:要记住,正确的题目数量比用时更重要。因此在觉得自己的程序正确,本地测试通过后,就要及时提交。
Q:题目中的测试数据测试通过,是否就表示程序正确?
A:不一定。有些题目的测试数据没有覆盖所有可能情况。需要自己另行编制测试数据。
Q:在C/C++中,main函数应该如何写?
A:应该写成: int main(){… return 0;}。请特别注意main函数的类型是整型,并且返回值为0。否则会导致Runtime Error。
Q:我的程序在VC中编译正确,提交后出现Compiler Error,具体信息是:
name lookup of `j' changed for new ISO `for别人的成绩?
A:除了根据气球判断别人解答出的问题外,不能直接看到排名表和别人成绩。
Q:我提交一个解答后,多长时间能够反馈回判决?
A:一般可以马上得出结果。如果超过5分钟仍未有结论,请速与工作人员联系。
Q:如果我的机器出问题怎么办?
A:请速与工作人员联系。请尽量在测试环境阶段发现问题。在正式比赛期间由于机器问题造成的比赛时间延误,一般不追加时间。
Q:我是否可以使用VC中的MFC类库?
A:不可以。作为替代方案,可以使用STL中的容器等工具。
Q:我是否可以使用C++中的STL?
A:可以。但是要注意VC中的STL存在一些与GNU编译器不一致的部分。最好使用那些已经被证明正确的部分。
Q:我是否可以使用动态内存?
A:可以。但是这样的程序不好调试,因此除非必要,建议避免使用。一般情况下可以直接申请一个足够大的数组等。
Prog < in.txt。也可以将结果写到另一个文件中,如prog < in.txt > out.txt。这种方式可以读取到文件结束符。
Q:输入输出是否有一定要求?
A:是的。试题中对于输入输出都有严格说明,必须按照这个标准进行。否则程序将不能得到正确结果。
Q:Compiler Error(编译错)是什么含义?
关于试题
Q:这个竞赛都考什么样的试题?
A:本竞赛是关于程序设计方面的竞赛,因此试题类型都是编制程序,解决一个问题。具体样例可以参见。
Q:题目的难度如何?
A:一般来说,如果在JOJ上能够作出50道左右的题目,那么在本次比赛中应该至少作出两道题。
Q:我需要测试输入数据是否满足输入条件么?
A:不需要。可以保证输入数据都是符合题目中的要求的。
Q:数据从那里输入?输出到哪里?
A:本次比赛的输入输出都是标准输入和标准输出。例如在C/C++中可以直接使用cin, cout。
Q:我在本地如何进行测试?
A:将你的程序编译成可执行文件后(假设为prog.exe),将输入数据写在一个文件中(假设为in.txt)。在命令行模式下,使用文件重定向来测试。例如:
Q:如果我在比赛过程中对试题有疑问怎么办?
A:可以通过在线的对话系统询问裁判。但请使用英语。
Q:我问裁判的问题,别人能够看到么?
A:一般看不到,当裁判认为这个问题有共性时,可以发布给大家。
Q:在比赛过程中,我能否看到自己的成绩?
A:可以看到自己以前的所有提交过程,包括每次提交的结论和提交时间。但不能看到自己在整个赛场的排名。
这是什么原因?
A:这是由于VC中存在与C++标准不兼容的部分,一般是如下类型的程序段引起的:for (int j=0; j<10; j++){…} j=10;
也就是说,在C++标准里,这种方式定义的变量j的作用域限制在for循环内部。如果要在for循环外继续使用这个变量,请将其定义提前到循环前。即如下例:
Q:我只会用PASCAL语言,是否可以参赛?
A:可以,本次竞赛允许使用PASCAL语言。但国际上的ACM竞赛只允许使用C/C++和Java语言,因此如果你想参加吉林大学ACM代表队,还要学习和使用这两种语言,尤其是C++。
Q:在判决时使用的数据是否和试题中的一样?
A:不一样。判决时使用的数据可以是符合题目要求的各种数据。数据量也可能很大。
Q:Presentation Error(格式错)是什么含义?
A:如果输出中只有空格和回车与答案不一样,则返回这个错误。在试题中均有严格说明,请仔细察看题目,尤其是空行。这个错误一般标志算法的基本方案已经正确了,离正确解答只有一步之遥。
语言细节
Q:比赛中所使用的编译器是什么?
A:在服务器上使用g++、fpc。在本地,由于条件限制,使用vc等。
A:是的。应该在全面阅读的基础上找出最简单的题目,从简到难开始做题。
Q:我应该先做哪道题?
A:先做最简单的,见上。
Q:我如何知道那道题最简单?
A:靠自己的理解能力和经验。在比赛开始一段时间后,可以根据多数人升起的气球颜色来参照。如果你认为某道题很简单,但是相应颜色的气球升起的很少,则这道题目可能有一些情况你和大家都没有考虑清楚。
比赛组织
Q(Question):我能否携带字典、书籍和程序清单?
A(Answer):可以,建议至少携带一本英文字典。
Q:我能否携带光盘、软盘等存储介质?
A:不能。
Q:我能否携带计算器?
A:不能。
Q:是否提供模拟题?
A:本次比赛不直接提供模拟题,选手可以直接到吉林大学ACM站点的在线测试(JOJ)中作题()。站点上的题目与本次比赛在风格、判决方式等方面基本类似,但难度上更高一些。
Q:我使用PASCAL语言,在读数据时经常出现错误,为什么?
A:由于PASCAL中的read, readln语句不能自动处理空白符,因此在输入时需要手工处理。另外在一次读入多个变量,而这时已经遇到文件结束时,将发生Runtime Error,请特别留意。
比赛经验
Q:我是否应该先全面阅读题目?
Q:我一定要按照题目的次序作题么?
A:不。选手可以自由决定作题的次序。试卷中的题目次序与试题难度无关。
Q:我是否要解决所有问题?
A:不必。如果你能解决所有问题,那么可以保证获得金奖了。
Q:要想获得一等奖,需要解决多少道题目?
A:按照我们的估计,大概需要解决三分之二以上的题目。
Q:自己进行测试时应注意什么?
A:应注意测试数据的代表性,尤其是边界条件的情况。
Q:比赛要结束前,我应该做哪道题?
A:一般来说,在比赛结束前一个小时内,应该集中力量做一道题。
Q:我的解答怎么会超时呢?
A:有可能测试数据中数据的规模很大,在本地要对这种数据进行测试。也可能对于输入数据的某些情况,存在一些快捷的判断方式。
A:本次比赛的提交程序由程序自动判决。在特殊情况下,由裁判判决。
Q:提交的是程序本身还是可执行文件?
A:程序。
Q:我是否可以将程序放到多个文件中?
A:不可以。
Q:是否会因为我的程序书写规范而获得奖励,或者因为程序不易读而遭到惩罚?
A:不会。一切以程序的执行结果为标准,除非特殊情况,否则裁判不会留意你的程序的。
Q:试题对算法有要求么?
A:没有,只要在限制时间内能够正确解答出来就可以。
Q:我的程序的运行时间远远低于要求,这是否作为一个衡量标准?
A:不会。只要在规定的时间内运行正确,都将同样对待。
Q:我已经在纸面上写出了某道题的答案,但由于时间原因没有在计算机上运行,能否给一定的分数?
A:不能。本比赛完全按照在计算机上的程序与运行决定成绩。
Q:在测试环境过程中,我应该干什么?
A:在此阶段,将出一道简单的热身题目,题目的解答与否与比赛成绩没有任何关系。选手应该在此期间熟悉所用机器的环境,检查软硬件是否有问题,并编制程序进行提交,熟悉提交系统的使用方法。可以故意编制一些含有错误的程序,熟悉系统对于错误提交的反馈结果。