暑假day1

題目名稱

素數

晨練

奇怪的桌子

學校

存盤文件名

sum.pas/c/cpp

run.pas/c/cpp

table.pas/c/cpp

school.pas/c/cpp

輸入文件名

sum.in

run.in

table.in

school.in

輸出文件名

sum.out

run.out

table.out

school.out

時限

1s

1s

3s

1s

內存限制

256M

256M

256M

256M

注意事項:請自行完成題目,切勿討論。


素數

【問題描述】

有一些正整數能夠表示爲一個或連續多個素數的和那麼給定一些正整數,求有多少種這樣的表示。

【輸入格式】

若干行,每行一個正整數(<=32767),輸入一個0結束。

【輸出格式】

對於輸入的每一個正整數輸出一行一個數表示其表示方法的個數

【輸入樣例】

2

3

17

41

20

666

12

53

0

【輸出樣例】

1

1

2

3

0

0

1

2

【數據範圍與約定】

對於100%的數據,所有數<=32767


素數的一些性質:

2是唯一的既是有偶數,又是質數的數。

偶數+偶數=偶數

偶數+奇數=奇數

奇數+奇數=偶數

由以上可知,

兩個相同的數相加不可能爲素數。

並且一個奇數加上一個奇數爲偶數也不可能爲素數。

但題給條件說要連續的素數。

所以以上結論

是多慮了。



仔細審題!!!!



於是可以直接枚舉素數累加就行了。


#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=32767;
int totP = 0,tot = 0;
int a[100010],Prime[maxn+10],ans[100010];
bool Mark[maxn+10];
int main(){
	freopen("sum.in","r",stdin);
	freopen("sum.out","w",stdout);
	memset(Mark,true,sizeof(Mark));
	Mark[0] = Mark[1] = false;
	tot = 0;
	while(1){
		tot++;
		scanf("%d",&a[tot]);
		if(a[tot] == 0){
			tot--;
			break;
		}
	} 
	for(int i = 2; i <= maxn; i++){
		for(int j = 2; i*j<=maxn; j++) if(Mark[i*j]) Mark[i*j] = false;
	}
	for(int i = 2; i <= maxn; i++){
		if(Mark[i]) Prime[++totP] = i;
	}
	for(int i = 1; i<= totP; i++){
		int Sum = 0;
		for(int j = i; j<=totP; j++){
			Sum+=Prime[j];
			if(Sum > maxn) break;
			ans[Sum]++;
		}
	}
	for(int i = 1; i<= tot; i++){
		printf("%d\n",ans[a[i]]);
	}
	return 0;
}

晨練

【問題描述】

Y 打算通過鍛鍊來培養自己的運動細胞,他選擇的運動方式是每天進行N分鐘的晨跑(1<=N<=10000)

在每分鐘的開始,小 Y 會選擇下一分鐘是用來跑步還是休息。小Y 的體力限制了他跑步的距離。更具體地,如果小Y 選擇在第i 分鐘內跑步,他可以在這一分鐘內跑D_i(1<=D_i<=1000)米,並且他的疲勞度會增加1。不過,無論何時小Y 的疲勞度都不能超過M(1 <=M<=500)。如果小Y 選擇休息,那麼他的疲勞度就會每分鐘減少1,但他必須休息到疲勞度恢復到0爲止。在疲勞度爲0 時休息的話,疲勞度不會再變動。晨跑開始時,小Y 的疲勞度爲0。還有,在N分鐘的鍛鍊結束時,小Y 的疲勞度也必須恢復到0,否則他將沒有足夠的精力來對付這一整天中剩下的事情。   請你計算一下,小 Y 最多能跑多少米。

【輸入格式】

1行:2個用空格隔開的整數:nm

2..n+1行:第i+1行爲1個整數D_i

【輸出格式】

輸出一行爲一個整數表示在滿足所有限制條件的情況下y能跑的最大距離

【輸入樣例】

5 2

5

3

4

2

10

【輸出樣例】

9

【數據範圍與約定】

對於30%的數據:n<=50。

對於100%的數據:n<=10000


這道題呢..

忽略了 f[i][0] = max(f[i-1][0],f[i][0])這個方程,導致狀態沒有轉移了。。

同時答案應該在f[n+1][0]而不是f[n][0],畢竟在n的時候還是可以選擇休息的。

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 10000;
int n,m;
int d[maxn+10];
int f[maxn+10][510];
int main(){
	freopen("run.in","r",stdin);
	freopen("run.out","w",stdout);
	scanf("%d %d",&n,&m);
	for(int i = 1; i <= n; i++){
		scanf("%d",&d[i]);
	}
	memset(f,0,sizeof(f));
	for(int i = 1; i <= n+1; i++){
		f[i][0] = max(f[i-1][0],f[i][0]); 
		for(int j = 1; j<= m; j++){
			f[i][j] = max(f[i][j],f[i-1][j-1] + d[i-1]);
			if(i >= j) f[i][0] = max(f[i][0],f[i-j][j]); 
		}
	} 
	printf("%d",f[n+1][0]);
	return 0;
} 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章