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的主要内容,如果未能解决你的问题,请参考以下文章

Day11 HDUOJ2612广度优先搜索求最小路径

hduoj题目分类

HDUOJ 1171

hduoj2094产生冠军

HDUOJ Quicksum

hduoj1285确定比赛名次