省赛集锦
第三届:
C:网络的可靠性 http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=170
这题虽然WA了几次,但还是很高兴的毕竟是完全是自己开发的。‘嘎嘎’
这题感觉比较实在,接近实际问题不错。
做的时候分析一些实例,然后得出结论就OK了。
Key: 分析几个问题后,会发现当一个基站的连接的光纤数为三时,就要注意这个基站了,总的来说这个规律不算难找。

1 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 using namespace std; 6 int num[10005]; 7 int main() 8 { 9 int n; 10 int i; 11 int a,b; 12 while(scanf("%d",&n)!=EOF) 13 { 14 memset(num,0,sizeof(num)); 15 16 for(i=1;i<n;i++) 17 { 18 cin>>a>>b; 19 num[a]++; 20 num[b]++; 21 } 22 if(n==1||n==2) 23 { 24 cout<<0<<endl; 25 continue; 26 } 27 int ans=0; 28 for(i=1;i<=n;i++) 29 { 30 if(num[i]>2) 31 ans++; 32 } 33 if(ans>1) 34 ans=(ans+1)/2; 35 ans++; 36 cout<<ans<<endl; 37 } 38 return 0; 39 } 40 41 42
D:聪明的KK http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=171
这一题深深的伤着我的心啊!这一题也体现了菜鸟、老鸟、和大牛的差别。
此题,我一上来就是一阵猛搜啊,还是优先的,搜的是浑天暗地啊!可惜WA如影随形!
最后看讨论版上竟然说是dp,若有所思,网上搜了一个看了一下比照着AC了。

1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 int n,m; 5 int map[25][25]; 6 int dp[25][25]; 7 int max(int a,int b) 8 { 9 return a>b?a:b; 10 } 11 int main() 12 { 13 int i,j; 14 while(cin>>n>>m) 15 { 16 for(i=0;i<n;i++) 17 for(j=0;j<m;j++) 18 cin>>map[i][j]; 19 memset(dp,0,sizeof(dp)); 20 for(i=1;i<=n;i++) 21 for(j=1;j<=m;j++) 22 { 23 dp[i][j]=max(dp[i][j-1]+map[i-1][j-1],dp[i-1][j]+map[i-1][j-1]); 24 } 25 cout<<dp[n][m]<<endl; 26 } 27 return 0; 28 }
可是一提交,好奇看了看推荐的优秀代码,顿时感觉自己弱爆了。

1 2 #include<iostream> 3 using namespace std; 4 int f[22][22]; 5 int main() 6 { 7 int n,m,c; 8 cin>>m>>n; 9 for(int i=1;i<=m;i++) 10 for(int j=1;j<=n;j++) 11 { 12 cin>>c; 13 f[i][j]=max(f[i][j-1],f[i-1][j])+c; 14 } 15 cout<<f[m][n]<<endl; 16 }
F: buying feed http://acm.nyist.net/JudgeOnline/problem.php?pid=248
贪心吧!只不过写的比较慢!

1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 using namespace std; 6 struct node{ 7 int x,f,c,j; 8 }s[150]; 9 bool cmp(node a,node b) 10 { 11 return a.j<b.j; 12 } 13 14 int main() 15 { 16 int t; 17 while(scanf("%d",&t)!=EOF) 18 { 19 while(t--){ 20 int k,e,n; 21 scanf("%d%d%d",&k,&e,&n); 22 int i; 23 for(i=0;i<n;i++) 24 { 25 scanf("%d%d%d",&s[i].x,&s[i].f,&s[i].c); 26 s[i].j=e-s[i].x+s[i].c; 27 } 28 29 sort(s,s+n,cmp); 30 31 int sum=0; 32 i=0; 33 while(k>=1) 34 { 35 if(k>=s[i].f) 36 { 37 sum+=s[i].f*s[i].j; 38 k-=s[i].f; 39 i++; 40 } 41 else 42 { 43 sum+=s[i].j*k; 44 k=0; 45 } 46 } 47 printf("%d\n",sum); 48 } 49 } 50 return 0; 51 }
G: Amazing Auction http://acm.nyist.net/JudgeOnline/problem.php?pid=251
题目不难,比较烦,写的较慢啊!当务之急是刷题提速啊!

1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<string> 5 #include<algorithm> 6 using namespace std; 7 int u,m; 8 struct node{ 9 string name; 10 int price; 11 }s[105]; 12 bool cmp(node a,node b) 13 { 14 return a.price<b.price; 15 } 16 int main() 17 { 18 int i,j; 19 while(scanf("%d%d",&u,&m)!=EOF) 20 { 21 for(i=0;i<m;i++) 22 cin>>s[i].name>>s[i].price; 23 int flag=0; 24 for(i=0;i<m-1;i++) 25 { 26 if(s[i].name.compare(s[i+1].name)!=0) 27 { 28 flag=1; 29 break; 30 } 31 } 32 if(flag==0) 33 { 34 sort(s,s+m,cmp); 35 cout<<"The winner is "<<s[0].name<<endl; 36 printf("The price is %d\n",s[0].price); 37 } 38 else 39 { 40 int num[1005]; 41 memset(num,0,sizeof(num)); 42 for(i=0;i<m;i++) 43 { 44 num[s[i].price]++; 45 } 46 int min=1000; 47 int mark; 48 for(i=0;i<=1005;i++) 49 { 50 if(min>num[i]&&num[i]!=0) 51 { 52 min=num[i]; 53 mark=i; 54 } 55 } 56 57 for(i=0;i<m;i++) 58 { 59 if(s[i].price==mark) 60 { 61 cout<<"The winner is "<<s[i].name<<endl; 62 cout<<"The price is "<<mark<<endl; 63 64 break; 65 } 66 } 67 68 69 70 } 71 72 } 73 return 0; 74 }
第四届:(最有水平的一届吧!呵呵)
C:表达式求值http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=305
递归!吾等菜鸟对递归的实现是不是还很生疏啊!有木有?
真是看懂递归恍然大悟,实现递归很有困难,大概这个思想还不是很能熟悉的驾驭吧!

1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 int n; 6 char str[333]; 7 int p; 8 int min(int x,int y) 9 { 10 return x<y?x:y; 11 } 12 int max(int x,int y) 13 { 14 return x>y?x:y; 15 } 16 int add(int x,int y) 17 { 18 return x+y; 19 } 20 int fac() 21 { 22 int num,i; 23 switch(str[p]) 24 { 25 case'm':p+=3;if(str[p-2]=='i') return min(fac(),fac());else return max(fac(),fac());break; 26 case'a':p+=3; return add(fac(),fac()); 27 case'(': 28 case')': 29 case',': p++; return fac(); 30 default:sscanf(str+p,"%d%n",&num,&i);p+=i; return num; 31 } 32 33 } 34 int main() 35 { 36 cin>>n; 37 while(n--) 38 { 39 cin>>str; 40 p=0; 41 cout<<fac()<<endl; 42 } 43 return 0; 44 }
D:走迷宫 http://acm.nyist.net/JudgeOnline/problem.php?pid=306
好吧!这样的迷宫菜鸟实在是没见过!无奈,无奈!
只好,比这学长的代码敲一遍了! @zzuli 郑勇学长http://pictureyong.blog.163.com/blog/#m=0
领悟ing。。。。。。

1 //二分 枚举上下界 + DFS 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 using namespace std; 6 int n; 7 int map[105][105]; 8 int mark[105][105]; 9 int MAX,MIN; 10 int R,L,flag; 11 int dir[4][2]={0,1,1,0,0,-1,-1,0}; 12 void DFS(int x,int y) 13 { 14 int xx,yy,i; 15 if(flag) return; 16 mark[x][y]=1; 17 if(map[x][y]<L||map[x][y]>R) 18 return ; 19 if(x==n&&y==n) 20 { 21 flag=1;return ; 22 } 23 for(i=0;i<4;i++) 24 { 25 xx=x+dir[i][0]; 26 yy=y+dir[i][1]; 27 if(xx>=1&&xx<=n&&yy>=1&&yy<=n&&mark[xx][yy]==0) 28 { 29 DFS(xx,yy); 30 } 31 } 32 } 33 34 35 int main() 36 { 37 while(scanf("%d",&n)!=EOF) 38 { 39 int i,j; 40 memset(map,0,sizeof(map)); 41 MAX=-1;MIN=10000; 42 for(i=1;i<=n;i++) 43 for(j=1;j<=n;j++) 44 { 45 cin>>map[i][j]; 46 if(MAX<map[i][j]) 47 MAX=map[i][j]; 48 if(MIN>map[i][j]) 49 MIN=map[i][j]; 50 } 51 int height,mid,low;//二分 52 height=MAX-MIN; 53 low=0; 54 while(height>=low) 55 { 56 mid=(low+height)/2; 57 for(i=MIN;i<=MAX-mid;i++) 58 { 59 R=i+mid;L=i;flag=0; 60 memset(mark,0,sizeof(mark)); 61 DFS(1,1); 62 if(flag) 63 { 64 break; 65 } 66 } 67 if(i<=MAX-mid) height=mid-1; 68 else low=mid+1; 69 } 70 printf("%d\n",height+1); 71 } 72 return 0; 73 }
F:substring http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=308
给定一个字符串,求改字符串的一个最长字串,并且该子串满足逆序后仍然是原串的字串。
该题主要是控制好两个循环就可以,比较难控制!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #include<iostream> #include<cstring> #include<string> #include<algorithm> using namespace std; int main() { int t; cin>>t; while (t--) { string s1,s2,ans; int max=0; cin>>s1; s2=s1; reverse(s2.begin(),s2.end()); int i,j; for (i=s1.size();i>max;i--) { for (j=0;j+i<=s1.size();j++) { if (s2.find(s1.substr(j,i))!=string::npos) { ans=s1.substr(j,i); max=i; break ; } } } cout<<ans<<endl; } return 0; } |
第五届:
最强DE战斗力 http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=541
较成熟的一届吧! 我们学校承办的!
学长出八队应战,斩金4枚,摘银3颗,牵铜一块!学长威武!@郑州轻工业学院
吾等菜鸟!压力山大!责任重大!
本题的规律题目已经给出,即可将每个数可以分成2和3,其中3 的数量要尽量的多,如6 可以分为3个2和2个3,显然2个3 的成绩跟大一点。
所以要优先考虑3.
但本题涉及数据较大,涉及到大数,增加了难度!

1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 int ans[207]; 6 void fac(int x) 7 { 8 int i; 9 for(i=0;i<201;i++) 10 ans[i]=ans[i]*x; 11 for(i=0;i<205;i++) 12 { 13 ans[i+1]+=ans[i]/10; 14 ans[i]%=10; 15 } 16 } 17 int main() 18 { 19 int n; 20 cin>>n; 21 while(n--) 22 { 23 int data; 24 int i; 25 cin>>data; 26 if(data<4) 27 cout<<data<<endl; 28 else 29 { 30 int k=data/3; 31 int y=data%3; 32 if(y==1) 33 { 34 k--; 35 y=4; 36 } 37 memset(ans,0,sizeof(ans)); 38 for(i=0,ans[0]=1;i<k;i++) 39 fac(3); 40 if(y!=0) 41 fac(y); 42 for(i=205;i>=0;i--) 43 if(ans[i]!=0) 44 break; 45 for(;i>=0;i--) 46 cout<<ans[i]; 47 cout<<endl; 48 } 49 50 } return 0; 51 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?