HDU2015
偶数求和
HDU2018
cow(n-1)+cow(n-3)
HDU2022
#include <stdio.h>
int main(void)
{
int n, m;
while(scanf("%d%d", &n, &m) != EOF)
{
int sum=0, ai=2, count=0, i;
for(i=1; i<=n; i++)
{
sum += ai;
ai += 2;
if( i % m == 0)
{
count++;
if(count != 1)
printf(" ");
printf("%d", sum / m);
sum = 0;
}
}
if(n % m == 0)
printf("\n");
else
printf(" %d\n", sum / (n % m));/*超出的部分*/
}
}
HDU2024
getchar() 用来吃空格
HDU2030
汉字占俩个字符,并且码小于0
注意getchar吃换行。
HDU2036
利用多边形(n边形)面积计算公式:
S=0.5 * ( (x0*y1-x1*y0) + (x1*y2-x2*y1) + ... + (xn*y0-x0*yn) ),
其中点(x0,y0), (x1, y1), ... ,
(xn,,yn)为多边形上按逆时针顺序的顶点((x0,y0)与(xn,yn)为同一点)。
HDU2039
注意用float
HDU2043
if(n>16||n<8)
char a[100]={'~','!','@','#','$','%','^'};
for(int i=0;i<n;i++)
{
if(s[i]<='Z'&&s[i]>='A')
f=1;
}
sum+=f; f=0;
HDU2045
F[N]=F[N-1]+2*F[N-2]
HDU2047
1 最后一个字符是O:
前面n-1个位置有2*M(n-2)种可能。而第n个位置此时是’O’,所以此时共有2* M(n-2)种可能;
2 最后一个字符不是 O:
n-1个位置有M(n-1)种可能,而第n个位置有两种可能,所以此时共有2*M(n-2)种可能
综上可知,本题的递推关系为:M(n)=2*[M(n-1)+M(n-2)]
HDU2049
s[i]=(i-1)*(s[i-1]+s[i-2])
2064&2049
Cnm*f(m);
HDU2050
线面问题
直线分平面 f(n)=f(n-1)+n
n(n+1)/2+1
折线分平面
f(n)=f(n-1)+4(n-1)+2-1
2n^2-n+1
封闭曲线分平面问题
f(n)=f(n-1)+2(n-1)
=n^2-n+2
平面分割空间问题(hdu1290)
(n^3+5n)/6+1
HDU2052
多加一个换行
HDU2053
做这种规律题要打表找规律
第一种方法可以通过-1和1为标志方便变换
也可以将1 4 9也就是1 2 3的平方赋值
HDU2054
换种问法 就是0与0.000是相同的
把点赋值为‘\0’
HDU2055
用的map函数 map<char,int> s符合映射关系
map要写在 using namespace std;下或者主函数里
s本身就是一个数组
HDU2058 连续序列和
假设首项是1,我们代入m=a1*n+n*(n-1)/2,则有n(n+1)=2m(n是项数的个数)。
所以有n*(n+1)=2m>n*n,即n<sqrt(2m); 也就是说项数最多的情况也只有sqrt(2m)。
(以上的'n'不是题目中的n,以上的'm'为题目中的m)
那么我们枚举1---sqrt(2m),枚举的是项数的个数(即数列区间长度);
m知道了,长度知道了,那么可以解出首项;(即解方程m=a1*n+n*(n-1)/2;)
for(i=int(sqrt(2*m));i>0;i--)
{
sum=m-i*(i-1)/2;
if(sum%i==0)
{
printf("[%d,%d]\n",sum/i,sum/i+i-1);
}
}
HDU2064
汉诺塔
有俩种算法 3f(n-1)+2;
3的n次幂减1;(不能用pow,精度有问题)
HDU2069
dp[0][0]=1;
for(int i=0;i<5;i++)
for(int k=1;k<=100;k++)
for(int j=a[i];j<=n;j++)
dp[j][k]+=dp[j-a[i]][k-1];
也可以用暴力的方法,不用计算1分的情况
HDU2072
map函数的用法
HDU2077
汉诺塔三 F(n)=f(n-1)+2;
int ans=1
n--;
while(n--)
ans*=3;
cout<<ans-1+2<<endl;
HDU2085
a[i]=3*a[i-1]+2*b[i-1];
b[i]=a[i-1]+b[i-1];
HDU2087
kmp水题
#include <cstdio>
#include <cstring>
const int MAXN = 1010;
char T[MAXN], P[MAXN];
int f[MAXN];
void getVal(int l) {
int i = 0, j = -1;
f[0] = -1;
while (i < l) {
if (j == -1 || P[i] == P[j]) {
i++;
j++;
f[i] = j;
} else
j = f[j];
}
}
int kmp()
{
int i=0,j=0,ans=0;
int lt=strlen(T),lp=strlen(P);
getVal(lp);
while(i<lt)
{
if (j == -1 || T[i] == P[j]) {
i++;
j++;
} else
j = f[j];
if (j == lp) {
ans++;
j = 0;
}
}
printf("%d\n", ans);
}
int main() {
while (scanf("%s%s", T, P) == 2) {
kmp();
}
return 0;
}
HDU2082
dp[0][0]=1
HDU2088
输出样列间有换行
int f=0;
if(f) cout<<endl;
.
.
.
f=1;
HDU2094
拓扑排序
#include<cstdio>
#include<iostream>
#include<cstring>
#include<map>
using namespace std;
#define MAXN 1010
int edge[MAXN][MAXN];
int ind[MAXN];
bool solve(int t)
{
int num=0;
for(int i=1;i<=t;i++)
if(ind[i]==0) num++;
if(num==1) return true;
return false;
}
int main()
{
int n;
map<string,int> name;
while(scanf("%d",&n)&&n)
{
name.clear();
memset(edge,0,sizeof(edge));
memset(ind,0,sizeof(ind));
int t=1;
char a[100],b[100];
for(int i=1;i<=n;i++)
{
scanf("%s%s",a,b);
if(!name[a]) name[a]=t++;
if(!name[b]) name[b]=t++;
edge[name[a]][name[b]]=1;
ind[name[b]]++;
}
t--;
if(solve(t)) puts("Yes");
else puts("No");
}
return 0;
}
HDU2095
异或
a^a=0,
0^a=a
HDU2098
打表