hduoj泛刷题记录:hduoj1000-1003
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hduoj泛刷题记录:hduoj1000-1003相关的知识,希望对你有一定的参考价值。
一年半没碰代码,手生是自然的。暑假打算泛刷hduoj,当作调整和复习。
(以下是正文)
HDUOJ 1000:
水题(迷之AC率),交了6次才过。主要原因是因为我忘了scanf()不返回1,以至于自己乱搞搞就花式TLE了。改成cin就AC了。下次注意恩
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int x,y; int main(){ while(cin>>x>>y){ cout<<x+y<<endl; } return 0; }
HDUOJ 1001:
水题,注意一下signed int
#include<cstdio> #include<iostream> using namespace std; int x,y; signed int sum; int main(){ while(cin>>x){ sum=0; for(int j=1;j<=x;j++) sum+=j; cout<<sum<<endl<<endl; } return 0; }
HDUOJ 1002:
裸高精加。有点遗忘,但还好高精都是用模拟理解,很快就想起来了。
交了好几次才过,被卡的原因有两点:
1.误以为头文件中的string和cstring是同个东西。只打了cstring,dev-c++没报错,但是交上去CE了。中间找了一些学长请教了一下,尴尬....
2.交了几次PE了,这题输出有点坑(可能是很久没写题的缘故)。最后一行答案,不可以外加空行。(1003也有这个问题,还好前面有1002铺垫)
#include<cstdio> #include<iostream> #include<cstring> #include<string> using namespace std; int a[1001],b[1001],c[1001],n,m,len,len1,len2; string s1,s2; void solve1(int len){ memset(a,0,sizeof(a)); for(int i=1;i<=len;i++) a[i]=s1[len-i]-‘0‘; } void solve2(int len){ memset(b,0,sizeof(b)); for(int i=1;i<=len;i++) b[i]=s2[len-i]-‘0‘; } void jia(){ memset(c,0,sizeof(c)); m=0; for(int i=1;i<=len;i++){ c[i]+=a[i]+b[i]+m; m=c[i]/10; c[i]%=10; } if(c[len+1]) len++; } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ cin>>s1>>s2; len1=s1.length(); solve1(len1); len2=s2.length(); solve2(len2); if(len1>len2) len=len1; else len=len2; jia(); printf("Case %d:\n",i); cout<<s1<<" + "<<s2<<" = "; for(int j=len;j>=1;j--) printf("%d",c[j]); printf("\n"); if(i!=n) printf("\n"); } return 0; }
HDUOJ 1003
最大子序列和裸题。
这个是真忘了,或者以前没学到过(毕竟动规太烂)。刚开始先打了个暴力O(N2),结果被卡了。只好去找找动规怎么打(毕竟动规这种东西,用脑子硬想怎么想得出来嘛)
然后发现还挺好理解的(注释如下)
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int n,m,sum,Begin,End,s,B,E;//Begin,End是最终的起始结尾,B,E则为暂时的 int a[1000001]; void Maxsum(){ Begin=0; End=0; sum=s=-99999; for(int i=1;i<=m;i++){ if(s<0){ //处理一下负数的情况 if(a[i]>s){ s=a[i]; B=E=i; if(sum<s){ Begin=B; End=E; sum=s; } } } else{ //转移 s+=a[i]; E=i; if(sum<s){ sum=s; Begin=B; End=E; } } } } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&m); memset(a,0,sizeof(a)); for(int j=1;j<=m;j++) scanf("%d",&a[j]); Maxsum(); printf("Case %d:\n",i); printf("%d %d %d\n",sum,Begin,End); if(i!=n) printf("\n"); } return 0; }
其实我觉得这不太像动规?
= =希望以后自己能回头看看这题吧,我觉得动规是我的硬伤,动态方程写不出来啊,过程不理解啊.....
rank94795
6/25
晚安
以上是关于hduoj泛刷题记录:hduoj1000-1003的主要内容,如果未能解决你的问题,请参考以下文章