OJ 419.
OJ 411.
OJ 410.
OJ 422.
第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢
#include <bits/stdc++.h>
using namespace std;
int main()
{ int n,i,t,a[100];
while(scanf("%d",&n)!=-1)
{a[0]=1;
for(i=1;i<n;i++)
a[i]=2*a[i-1]+2;
printf("%d\n",a[n-1]);
}
return 0;
}
OJ 426.
#include <bits/stdc++.h>
using namespace std;
int main()
{string a;int n;
while(cin>>n)
{for(int i=1;i<=n;i++)
{int flag=0;
cin>>a;
int l=a.length();
for(int j=0;j<l;j++)
{if(a[j]>='0'&&a[j]<='9')
flag++;
}
cout<<flag<<endl;}
}
return 0;
}
OJ 430.
贪心算法
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,x,s;
while(cin>>n&&n)
{
s=0;//n是教师个数
for(int i=0;i<n;i++)
{
cin>>x;//x是这个教师工资
if(x/100>0){s=s+x/100;x=x%100;}//s是纸币个数
if(x/50>0){s=s+x/50;x=x%50;}
if(x/10>0){s=s+x/10;x=x%10;}
if(x/5>0){s=s+x/5;x=x%5;}
if(x/2>0){s=s+x/2;x=x%2;}
s=s+x;
}
printf("%d\n",s);
}
return 0;
}//贪心算法就是可着最大的先来
#include <stdio.h>
#include <stdlib.h>
int main()
{ int s1,s2,n,j,a,b,i,k;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d %d",&a,&b);
s1=s2=0;
for(k=1;k<a;k++)
{
if(a%k==0)
s1+=k;
}
for(j=1;j<b;j++)
{
if(b%j==0)
s2+=j;
}
if(s1==b&&s2==a)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
OJ 452.
小老鼠走迷宫通解
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
int a,b,n;
ll way[60];
way[1]=1;
way[2]=2;
for(int i=3;i<54;i++)
{
way[i]=way[i-1]+way[i-2];
}
cin>>n;
while(n--)
{
cin>>a>>b;
cout<<way[b-a]<<endl;
}
return 0;
}
OJ 523.
简单递推
牛顿的家里有三棵苹果树A,B,C,树上结满了无数个好苹果和毒苹果。牛顿站在一棵苹果树下,他能选择接这棵树掉下的苹果,也可以选择接右边树所掉落的苹果(每次牛顿只能选择接一棵树所掉落的苹果)。假设牛顿的背包无限大,能接很多的苹果,但是每只毒苹果和一只好苹果相遇就会令这2只苹果都从人间消失。
在每次整数秒的时刻,苹果开始掉落,每棵树每次只掉落同一类型的苹果(掉好苹果或掉毒苹果)。苹果掉落时可以几个苹果一块掉落,且毒苹果的数量远远少于好苹果的数量。
Input
输入数据有多组,每组第1行是n ,接下来有n行,每行4个数,为T,A,B,C,分别代表每次掉落的时间(秒),A,B,C三棵树掉落的苹果数(正数代表好苹果的数量,负数代表毒苹果的数量),这里T的范围( 1<=T<=20, 1<=A,B,C<=100)。输入数据已经按照时间从小到大排好序了,而且T是连续的。
Output
在一行内输出牛顿能接到的苹果的最大值。
Sample Input
4
1 1 4 2
2 0 5 0
3 2 3 4
4 6 1 2
5
1 -1 -2 9
2 11 0 7
3 6 5 2
4 -1 -2 3
5 2 4 -1
Sample Output
15
20
DP入门题。这题构造一个n行3列的二维矩阵a,每次输入的时间其实没用,因为数据保证时间连续并且递增。每次输入时间后,把第i次输入的第j个数保存到a[i][j]中,
之后把dp数组全部初始化为负值,然后再把dp数组的第一行初始化为a数组的值,从第二行从上往下递推,递推到最后一行,找到最后一行中dp数组的最大值即可。
本题为杭电hdu 1176 免费馅饼的简单版本,不过思路都差不多吧,都是简单的DP,递推一下就可以了。
#include <bits/stdc++.h>
using namespace std;
const int inf=-0x3f3f3f3f;
int n,t,mx,a[30][10],dp[30][10];
int main()
{
ios::sync_with_stdio(false);
while(cin>>n)
{
memset(a,0,sizeof(a));
memset(dp,inf,sizeof(dp));
for(int i=1;i<=n;i++)
cin>>t>>a[i][1]>>a[i][2]>>a[i][3];
mx=inf;
for(int i=1;i<=3;i++)
dp[1][i]=a[1][i];//先初始化第一行的dp数值
for(int i=2;i<=n;i++)
for(int j=1;j<=3;j++)
dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+a[i][j];
for(int i=1;i<=3;i++)
mx=max(mx,dp[n][i]);
printf("%d\n",mx);
}
return 0;
}