題目名稱 |
素數 |
晨練 |
奇怪的桌子 |
學校 |
存盤文件名 |
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個用空格隔開的整數:n,m。
第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;
}