PKU_ACM解题日记
2007-11-06 21:51
204 查看
2007年9月19日星期三(3)
1664放苹果简单的递归
算法如下:
1):要么每个盘子都放一个,要么只放到n-1个盘子
代码如下:
intplaceapple(intm,intn)
{
if(m<0)return0;//有些盘不放,已在placeapple(m,n-1)里面了,故返回零
if(m==0)return1;//每个盘都放一个,这是一种情况
if(n==0)return0;//剩余的只放到一个盘去,已在placeapple(m,n-1)里面了,故返回零
returnplaceapple(m-n,n)+placeapple(m,n-1);//要么每个盘都放一个,要么只放到n-1各盘
}
3077Rounder送分题
题意:从最低位开始向最高位四舍五入
代码:略
3078Q简单的模拟题
算法:1):设置两个数组a[],b[],把每次操作中的a中指定的元素放到数组b指定的位置去
2):把数组a中剩余的元素依次放到数组b中的空位即可!
3):按序输出数组b的各元素
代码:略
2007年9月20日星期四(4)
1458CommonSubsequeuece动态规划求最长公共子序列
算法:典型的简单的动态规划
代码:略
注意的地方:读入字符串时候while(scanf("%s%s",a,b)==2),这样子是AC,while(scanf("%s%s",a,b))这样子是TLE!
2007年9月21日星期五(6)
2014FlowLayout简单的模拟题(送分题)
算法:无
代码:略
注意的地方:这类题目就是要小心!!!凡是模拟题都是!!!
2766Laserbox模拟题,有点烦,主要还是不够细心!
算法:无
代码:略
2007年9月22日星期六(8)
1125StockbrokerGrapevine典型的FLOYD
算法:floyd
代码:略
2421ConstructingRoads最少生成树(prim)(kruskal还没调出来)
算法:prim
代码:voidprim(inta[][max],intn,intv)
{
intlowcost[max],vset[max],cost=0;
for(inti=1;i<=n;i++)
vset[i]=0;
for(i=1;i<=n;i++)
if(i!=v)
lowcost[i]=a[v][i];
for(i=1;i<n;i++)//找出n-1个顶点
{
intmin=INF,k=-1;
for(intj=1;j<=n;j++)
if(vset[j]==0&&lowcost[j]<min)
{
min=lowcost[j];
k=j;
}
cost+=min;
vset[k]=1;
for(j=1;j<=n;j++)
if(vset[j]==0&&lowcost[j]>a[k][j])
lowcost[j]=a[k][j];
}
cout<<cost<<endl;
}
备注:其实prim算法的代码跟Dijkstra算法求最短路径很相像,都用到一个标志数组和要寻找最短的边
2007年9月23日星期天(9)
3388JananesePuzzle简单的二分
算法:二分
代码:略
2007年9月24日星期一(13)
3385Genealogy简单题
算法:无
代码:略
3386HalloweenHolidays简单题
算法:无
代码:略
1088滑雪动态规划
算法:DP的记忆化搜索
代码:intskee(intI,intj)
{
Intmax=1,tmp;
If(len[i][j]!=-1)returnlen[i][j];
If(a[i][j]<a[i-1][j]&&i>1)
{
Tmp=skee(i-1,j);
If(max<tmp+1)max=tmp+1;
}
If(a[i][j]<a[i+1][j]&&i<r)
{
Tmp=skee(i+1,j);
If(max<tmp+1)max=tmp+1;
}
If(a[i][j]<a[i][j-1]&&j>1)
{
Tmp=skee(i,j-1);
If(max<tmp+1)max=tmp+1;
}
If(a[i][j]<a[i][j+1]&&j<c)
{
Tmp=skee(i,j+1);
If(max<tmp+1)max=tmp+1;
}
Len[i][j]=max;returnmax;}
1159Palindrome给出一个句子,问插入几个字符可使之成为回文
算法:典型的DP
代码:if(s[i]==s[j])min[i][j]=min[i+1][j-1];
elsemin[i][j]=minimum(min[i+1][j],min[i][j-1])+1
其中,i从n开始到1,j从i到n,最后min[1]
就是所求!
2007年9月25日星期二(14)
1978HanafudaShuffle简单题
算法:无
代码:略
2007年9月26日星期三(16)
1080HumaGeneFunctions变种最长公共子序列(DP)
算法:DP(LCS)
代码:动归方程
func[i][j]=max(func[i-1][j]+w[a[i]][0],func[i][j-1]+w[0][b[j]],func[i-1][j-1]+w[a[i]][b[j]])
2196SpecializedFour-DigitNumber简单题
算法:用de记录num用十进制表示时的各位数之和,du记录用12进制表示时的各位数之和,he则记录十六进制时的各位之和,若de==du==he,则输出num
代码:略
2007年9月27日星期四(20)
2039ToAndFro简单题
算法:按序保存在一个二维矩阵,再以列优先输出即可
代码:略
2013SymmetricOrder简单题
算法:i从1开始每隔2就输出该字符串(i<n);若n是偶数,则i再从n开始每隔2递减输出该字符串,否则,从n-1开始(i>0)
代码:略
2606RabbitHunt简单的几何题
算法:算出每个顶点与其他顶点的斜率并记录其斜率相等的个数的最大值,输出即可
代码:略
3390PrintWordsinLines线性DP
算法:用d[i]表示打印前i个字符的最优解,则其动归方程为:
d[i]=min{d[j]+cost(i,j)},cost(i,j)表示从j到i打印在一行的代价
2007年9月30日星期日(22)
3399Product简单题,但自己却WA了n次
题意:给出n个数,要求从中取k个数使得它们的乘积最大
算法:1:当全为负数时候,若k为奇数,则取最大的k个;否则,取最少的k个;2:有正有负或全为正的时候,若k为奇数,先取最大的正数,然后从两头开始每两个的取,并选之中乘积较大的两个
代码:略
1862Stripies简单的数学题
题意:给出一列数,每次去两个最大的数(均值不等式)按公式2*sqrt(m1*m2)合并为一个数,到最后只剩下一个数并输出即可!
算法:无,只是要特别考虑只有一个数的时候
代码:略
NUAA1111典型的DP—01背包问题
题意:实质就是01背包问题
算法:动归方程:dp[i]=max{dp[i-weight]+value}
代码:如下:
#include<iostream>
usingnamespacestd;
structnode
{
intweight;
intvalue;
}a[101];
intn,m,s[101],dp[2001];
intmain()
{
inti,j,k,sum;
while(scanf("%d",&n)==1)
{
for(i=0;i<n;i++)
scanf("%d",&s[i]);//记录各容器空间
scanf("%d",&m);
for(i=0;i<m;i++)
scanf("%d%d",&a[i].weight,&a[i].value);
memset(dp,0,sizeof(dp));
for(i=0;i<2001;i++)
for(j=0;j<m;j++)
{
k=a[j].weight;
if(i>=k&&dp[i]<dp[i-k]+a[j].value)
dp[i]=dp[i-k]+a[j].value;
}
sum=0;
for(i=0;i<n;i++)
sum+=dp[s[i]];
printf("%d/n",sum);
}
return0;
}
2007年10月1日星期一(24)
2389BullMath简单的大数相加
题意:给出两个数,要求它们的和
算法:大数相加
代码:for(i=0;i<lena;i++)
1664放苹果简单的递归
算法如下:
1):要么每个盘子都放一个,要么只放到n-1个盘子
代码如下:
intplaceapple(intm,intn)
{
if(m<0)return0;//有些盘不放,已在placeapple(m,n-1)里面了,故返回零
if(m==0)return1;//每个盘都放一个,这是一种情况
if(n==0)return0;//剩余的只放到一个盘去,已在placeapple(m,n-1)里面了,故返回零
returnplaceapple(m-n,n)+placeapple(m,n-1);//要么每个盘都放一个,要么只放到n-1各盘
}
3077Rounder送分题
题意:从最低位开始向最高位四舍五入
代码:略
3078Q简单的模拟题
算法:1):设置两个数组a[],b[],把每次操作中的a中指定的元素放到数组b指定的位置去
2):把数组a中剩余的元素依次放到数组b中的空位即可!
3):按序输出数组b的各元素
代码:略
2007年9月20日星期四(4)
1458CommonSubsequeuece动态规划求最长公共子序列
算法:典型的简单的动态规划
代码:略
注意的地方:读入字符串时候while(scanf("%s%s",a,b)==2),这样子是AC,while(scanf("%s%s",a,b))这样子是TLE!
2007年9月21日星期五(6)
2014FlowLayout简单的模拟题(送分题)
算法:无
代码:略
注意的地方:这类题目就是要小心!!!凡是模拟题都是!!!
2766Laserbox模拟题,有点烦,主要还是不够细心!
算法:无
代码:略
2007年9月22日星期六(8)
1125StockbrokerGrapevine典型的FLOYD
算法:floyd
代码:略
2421ConstructingRoads最少生成树(prim)(kruskal还没调出来)
算法:prim
代码:voidprim(inta[][max],intn,intv)
{
intlowcost[max],vset[max],cost=0;
for(inti=1;i<=n;i++)
vset[i]=0;
for(i=1;i<=n;i++)
if(i!=v)
lowcost[i]=a[v][i];
for(i=1;i<n;i++)//找出n-1个顶点
{
intmin=INF,k=-1;
for(intj=1;j<=n;j++)
if(vset[j]==0&&lowcost[j]<min)
{
min=lowcost[j];
k=j;
}
cost+=min;
vset[k]=1;
for(j=1;j<=n;j++)
if(vset[j]==0&&lowcost[j]>a[k][j])
lowcost[j]=a[k][j];
}
cout<<cost<<endl;
}
备注:其实prim算法的代码跟Dijkstra算法求最短路径很相像,都用到一个标志数组和要寻找最短的边
2007年9月23日星期天(9)
3388JananesePuzzle简单的二分
算法:二分
代码:略
2007年9月24日星期一(13)
3385Genealogy简单题
算法:无
代码:略
3386HalloweenHolidays简单题
算法:无
代码:略
1088滑雪动态规划
算法:DP的记忆化搜索
代码:intskee(intI,intj)
{
Intmax=1,tmp;
If(len[i][j]!=-1)returnlen[i][j];
If(a[i][j]<a[i-1][j]&&i>1)
{
Tmp=skee(i-1,j);
If(max<tmp+1)max=tmp+1;
}
If(a[i][j]<a[i+1][j]&&i<r)
{
Tmp=skee(i+1,j);
If(max<tmp+1)max=tmp+1;
}
If(a[i][j]<a[i][j-1]&&j>1)
{
Tmp=skee(i,j-1);
If(max<tmp+1)max=tmp+1;
}
If(a[i][j]<a[i][j+1]&&j<c)
{
Tmp=skee(i,j+1);
If(max<tmp+1)max=tmp+1;
}
Len[i][j]=max;returnmax;}
1159Palindrome给出一个句子,问插入几个字符可使之成为回文
算法:典型的DP
代码:if(s[i]==s[j])min[i][j]=min[i+1][j-1];
elsemin[i][j]=minimum(min[i+1][j],min[i][j-1])+1
其中,i从n开始到1,j从i到n,最后min[1]
就是所求!
2007年9月25日星期二(14)
1978HanafudaShuffle简单题
算法:无
代码:略
2007年9月26日星期三(16)
1080HumaGeneFunctions变种最长公共子序列(DP)
算法:DP(LCS)
代码:动归方程
func[i][j]=max(func[i-1][j]+w[a[i]][0],func[i][j-1]+w[0][b[j]],func[i-1][j-1]+w[a[i]][b[j]])
2196SpecializedFour-DigitNumber简单题
算法:用de记录num用十进制表示时的各位数之和,du记录用12进制表示时的各位数之和,he则记录十六进制时的各位之和,若de==du==he,则输出num
代码:略
2007年9月27日星期四(20)
2039ToAndFro简单题
算法:按序保存在一个二维矩阵,再以列优先输出即可
代码:略
2013SymmetricOrder简单题
算法:i从1开始每隔2就输出该字符串(i<n);若n是偶数,则i再从n开始每隔2递减输出该字符串,否则,从n-1开始(i>0)
代码:略
2606RabbitHunt简单的几何题
算法:算出每个顶点与其他顶点的斜率并记录其斜率相等的个数的最大值,输出即可
代码:略
3390PrintWordsinLines线性DP
算法:用d[i]表示打印前i个字符的最优解,则其动归方程为:
d[i]=min{d[j]+cost(i,j)},cost(i,j)表示从j到i打印在一行的代价
代码:#include<iostream>
#include<cmath>
·usingnamespacestd;
·constINF=100000000;
·intlen[10001],min[10001];
·
·intmain()
·{
·intc,m,n;
·scanf("%d",&c);
·while(c--)
·{
·scanf("%d%d",&m,&n);
·for(inti=0;i<n;i++)
·scanf("%d",&len[i]);
·min[0]=pow((m-len[0])*1.0,2);
·for(i=1;i<n;i++)
·{
·inttmp=len[0];
·for(intj=1;j<=i;j++)
·tmp+=len[j]+1;
·if(tmp>m)
·min[i]=INF;
·else
·min[i]=pow((m-tmp)*1.0,2);
·tmp=0;
·
·for(j=1;j<=i;j++)
·{
·if(tmp!=0)tmp++;
·tmp+=len[i-j+1];
·if(tmp>m)break;
·if(min[i]>min[i-j]+pow((m-tmp)*1.0,2))
·min[i]=min[i-j]+pow((m-tmp)*1.0,2);
·}
·}
·printf("%d/n",min[n-1]);
·}
return0;
}
2007年9月30日星期日(22)
3399Product简单题,但自己却WA了n次
题意:给出n个数,要求从中取k个数使得它们的乘积最大
算法:1:当全为负数时候,若k为奇数,则取最大的k个;否则,取最少的k个;2:有正有负或全为正的时候,若k为奇数,先取最大的正数,然后从两头开始每两个的取,并选之中乘积较大的两个
代码:略
1862Stripies简单的数学题
题意:给出一列数,每次去两个最大的数(均值不等式)按公式2*sqrt(m1*m2)合并为一个数,到最后只剩下一个数并输出即可!
算法:无,只是要特别考虑只有一个数的时候
代码:略
NUAA1111典型的DP—01背包问题
题意:实质就是01背包问题
算法:动归方程:dp[i]=max{dp[i-weight]+value}
代码:如下:
#include<iostream>
usingnamespacestd;
structnode
{
intweight;
intvalue;
}a[101];
intn,m,s[101],dp[2001];
intmain()
{
inti,j,k,sum;
while(scanf("%d",&n)==1)
{
for(i=0;i<n;i++)
scanf("%d",&s[i]);//记录各容器空间
scanf("%d",&m);
for(i=0;i<m;i++)
scanf("%d%d",&a[i].weight,&a[i].value);
memset(dp,0,sizeof(dp));
for(i=0;i<2001;i++)
for(j=0;j<m;j++)
{
k=a[j].weight;
if(i>=k&&dp[i]<dp[i-k]+a[j].value)
dp[i]=dp[i-k]+a[j].value;
}
sum=0;
for(i=0;i<n;i++)
sum+=dp[s[i]];
printf("%d/n",sum);
}
return0;
}
2007年10月1日星期一(24)
2389BullMath简单的大数相加
题意:给出两个数,要求它们的和
算法:大数相加
代码:for(i=0;i<lena;i++)
·for(j=0;j<lenb;j++)
·{
·c[i+j]+=a[i]*b[j];
·c[i+j+1]+=c[i+j]/10;
·c[i+j]%=10;
·}
·if(c[i+j-1]!=0)lenc=lena+lenb;
elselenc=lena+lenb-1;
2371QuestionsAndAnswers
题意:给出一个数组,要求排序后按给定的下标输出
算法:无
代码:略
2007年10月2日星期二(25)
1731Orders用STL解决的简单题
题意:给定一个字符串(最长为200个字符串),输出其全排列
算法:用next_permutation()和prev_permutation()求组合数,但注意要先排序,包含在algorithm里面,其中还有sort(),好用!
代码:cin>>s;
·intlen=strlen(s);
·sort(s,s+len);
·cout<<s<<endl;
·while(next_permutation(s,s+len))
cout<<s<<endl;
2007年10月3日星期三(29)
1256Anagram跟组合有关的题目
题意:给出一个字符串,要求输出所有排列组合数,但顺序是A<a<B<b<….<Z<z
算法:nest_permutation()的另一种用法
代码:
#include<iostream>
#include<algorithm>
#include<string>
usingnamespacestd;
classorder
{
public:
booloperator()(charx,chary)
{
if(x==y)
returnx<y;
if(x==y+32||y==x+32)
returnx<y;
if(x>='A'&&x<='Z')
x+=32;
if(y>='A'&&y<='Z')
y+=32;
if(x!=y)
returnx<y;
}
};
intmain()
{
intm;
cin>>m;
stringx;
stringy;
for(inti=0;i<m;++i)
{
cin>>x;
sort(x.begin(),x.end(),order());
cout<<x<<endl;
y=x;
while(next_permutation(x.begin(),x.end(),order()))
{
if(y!=x)
cout<<x<<endl;
y=x;
}
}
return0;
}
1833排列有一个关于组合的问题
题意:给出一组数,输出从该组合开始的第k组合数
算法:next_permutation()
代码:略
1146IDCodes组合
题意:一个字符串,存在下一个排列的,输出,否则,输出“NO..”
算法:next_permutation()
代码:略
2245Lotto组合问题
题意:给出一组数(6到13个),把其中由6个数组成的序列按从小到大顺序输出
算法:超暴力,六个for循环
代码:略
2007年10月4日星期四(30)
1141BracketsSequence动态规划之记忆化搜索
题意:给出以列括号’(‘,’)’,’[‘,’]’,其中’()’,’[]’是规则序列,若A和B是规则序列,则’(A)’,’[A]’,AB也是规则序列,现在问对于所给出的括号序列,问最少添加几个括号,使之成为规则序列
算法:记忆化搜索(DP)
代码:D:/program/1141/1141.cpp
2007年10月5日星期五(31)
2136VerticalHistogram简单题
题意:给出一个大写的字符串序列,计算各个字符出现的次数,并打表输出,注意不能输出多余的空格(WA了n次)
算法:就是要注意不能输出多余的空格即可
代码:略
2007年10月8日星期一(32)
2405Beavegnaw简单的数学题
题意:已知圆台的底直径D和体积V,求上直径d,台高为D-d
算法:就一个圆台体积公式
代码:略
2007年10月9日星期二(34)
2737SwampThings
题意:给出n(n<1000)个点,算出最多的共线的点(不少于4,如果少于4,输出0)
算法:fori:0ton-max确定一个顶点,并算出与其余各点的斜率(如此即可保证只要斜率相等就一定共线),记下过这点的直线族中顶点最多的数目max
代码:D:/program/2737/2737.cpp
2738TwoEnds
题意:两个人(假设是player1和player2)玩游戏,给出一列数,要求必须从数组的两头开始取,player1先取,接着player2采用贪心法,即取数组两头中较大的那个数,如此取法直至把所有的数取完,要求使得player1-player2的值最大
算法记忆化搜索(DP)
Player1=max{
a[low]+
max{solve(low+2,high),solve(low+1,high-1)},
a[high]+
max{solve(low,high-2),solve(low+1,high-1)}
}
代码:D:/program/2738/2738.cpp
2007年10月10日星期三(36)
2033Alphacode动态规划之记忆化搜索
题意:A,B,C…..X,Y,Z分别对应1,2,3…..24,25,26,现在给出一个数字串,问有几种翻译的方法
算法:记忆化搜索
代码:
intsolve(inti)
·{
·inttmp=0;
·if(i>=len)return1;
·if(dp[i]!=0)returndp[i];
·if(s[i]>'2'||(s[i]=='2'&&s[i+1]>'6'))
·tmp=solve(i+1);
·elseif((s[i]=='2'||s[i]=='1')&&s[i+1]=='0')
·tmp=solve(i+2);
·elseif(s[i]=='1'||(s[i]=='2'&&s[i+1]<='6'))
·{
·if(i+2<=len)
·tmp=solve(i+1)+solve(i+2);
·elseif(i+1<=len)
·tmp=solve(i+1);
·}
·dp[i]=tmp;
returntmp;
}
1118LiningUp简单的几何题
题意:给出一列点,问共线的最多点数(与2606一样)
算法:算出斜率,排序,搜一遍即可
代码:略
2007年10月11日星期四(37)
2036IConduit几何题,有点麻烦
题意:可以抽象为:给出n条线段(n<=10000),若任意两条线段平行且有交点,则可以把两条线段合并为一条,问最后剩下有几条?
算法:按线段的斜率、与y轴的截距、最小的x轴坐标、最小的y轴坐标从小到大排序,再搜一遍即可
代码:略
2007年10月14日星期日(38)
1045BodePlot简单的物理题(如果知道公式的话)
题意:给出几个已知量和两个要用到的公式要求推算出另一变量的值
算法:无
代码:略
2007年10月15日星期一(41)
2092GrandpaisFamous简单题
题意:给出一串数字,要求输出出现次数第二多的数,如果超过一个,就从小到大输出
算法:快排
代码:略
2260ErrorCorrection简单题
题意:给出一个布尔(01)数组,若每行每列的和都是2的倍数,则输出OK;否则,若只是通过改变数组中的一位就使得数组满足上述条件,输出相应的操作;否则,输出Corrupt
算法:在判断只改变一位就满足条件的时候,只要找出不满足条件的第一行i,然后在该行中的各列寻找不满足条件的列j,修改该位后再判断是否满足即可
代码:略
3359Wordfish简单的排列组合题
题意:给出一个大写的不超过21个字符的字符串,往前和往后各生成10个字符串,然后在这21个字符串当中的找出一个最大的相邻字符的绝对值只差最少的字符串,然后输出该串和该数字即可
算法:next_permutation()和prev_permutation()
代码:略
2007年10月16日星期二(42)
3421X-factorChains数学题
题意:给定一个数m,要求最长序列1、x1、x2….m,其中x2可以被x1整除,问这样的最长序列有几个?
算法:算出m可被哪些素数整除和各个素数在这里出现的次数,假设m可被整除n次,而每个素数出现的次数为c1、c2...那么,这样的序列的个数num=n!/c1!*c2!*..
代码:略
2007年10月17日星期三(44)
3278CatchThatCow简单的搜索题
题意:在x轴的正半轴上,给定人和奶牛的坐标n和k,而人有三种走法:1):往前走一步,2):往后走一步,3):从n跳到2*n,但若人在奶牛的右边,那么人只能一步一步的往回走,现在问人要抓到奶牛最少要走的步数!
算法:广搜,范围不大,才100,000,设个标志数组即可
代码:略
1113Wall典型的凸包(第一个凸包)
题意:有一个宫廷,要求用最短的墙围起来,但墙离宫廷的距离不能少于一个给定的值
算法:凸包,
代码:略
2007年10月18日星期四(45)
2187BeautyContest典型的凸包(第二个凸包,我要找第三个!!!)
题意:给定一堆点,要求出任意两点之间的最大距离(严格的说是距离的平方)
算法:凸包Graham-Scan,算出外围的点之后,求任意两点的距离,取最大的即可(据说还有优化的方法!我这是最笨的^_^)
代码:略
2007年10月19日星期五(50)
2941HomogeneousSquares数学题
题意:一个行列数为n的二维数组,如果每n个不同行不同列的数的和都相等,则输出YES,否则…..
算法:如果跟对角线平行的每行数的和都相等,则可认为是相等的,这样做就AC了,但不能证明其正确性
代码:略
2940WineTradinginGergovia贪心题
题意:一个城镇里每户人家(房子都在一条直线上)都提供酒或需要酒,并且供需平衡,已知相邻两户人家每搬运一个单元的酒就需要k个单元的劳动力,现在问该如何搬运使得所需的劳动力最少
算法:非常典型的贪心:从第一户人家开始,不管其是供还是需x,都必须在第一户和第二户之间搬运x单元的酒,此时合并这两户人家,假设其需或供y单元的酒,则再与第三户人家比较时候,要搬运y单元的酒,如此下去,直至第n户人家】
代码:while(n--)
·{
·intx;
·scanf("%d",&x);
·x+=rest;
·total+=abs(x);
·rest=x;
}
2864PascalLibrary菜题
题意:有n个人,举行过d次活动(筹款晚宴),用一个d行n列的二维数组表示其出席情况,出席了为1,否则,为0,现在问有没有至少一个人出席了全部的活动
算法:略
代码:略
2159AncientCipher看起来蛮吓人的,其实是菜题,理解题意万岁!
题意:有两种加密的方法:1):替换,即用另一个字符替代这个字符,2):排列组合,即把该字符串的顺序搞乱。现在给出一个密码和一个猜测的答案,问可否由密码按照某种方法得到那个猜测的答案
算法:看两个字符串中相同字符出现的次数是否相等即可
代码:略
1565SkewBinary数学菜题
题意:有一种二进制表示方法:即从最后一位开始往前的第一个非零数字可以为2,现在给出这样的一个二进制数,要求输出其十进制形式
算法:略
代码:略
2007年10月20日星期六(52)
1228Grandpa’Estate凸包
题意:爷爷的庄园是用一些插在地上的一些圆柱围起来使得能够和别人的庄园区分开来,但因年久失修,有些圆柱已经不见了,现在问能不能够从剩下的这些圆柱中唯一的确定庄园?
算法:典型的凸包,由题意可知这些圆柱都是凸包上的点,而从这些点来唯一的确定庄园,必须是凸包边上都必须由三个或以上的点,因为如果只有两个点,那么我们一点可以再添一个点,使得这个点和原来的这些点组成一个更大的凸包,也就是说凸包不唯一!
代码:略
2301BeattheSpead绝对的菜题!
题意:给定两个数,如果第一个数大于第二个数,则一次输出两数的差的二分之一和两数和的二分之一,否则,输出impossible
算法:无
代码:略
2007年10月21日星期日(54)
3425Customersupport简单的数学题
题意:客户每问一个问题:如果得到一个错误的回答,收费10¥;如果只是得到一个正确的答案,收费20¥;如果得到一个正确的答案并且有解释,收费40¥;如果问的问题已被正确回答过n次,则营收费40+n*10¥,现在要求输出一个月的收入
算法:无
代码:略
3427Ecologytax理解好题意,其实也是菜题
题意:一个森林有n棵高度已知的树,树每年长高一米,有一个采伐公司到这个森林里伐木,这个公司的汽车每次可以运走长度为l的圆柱,所以必须把每棵树都截成长度为l的圆柱,而剩下的就是浪费掉的,而该国家有规定,浪费木材是要受罚的,而且受罚的程度和浪费的程度成正比,现在要问公司应该在那一年采伐可使受罚的最低?
算法:只要看哪一年的树的高度是l的倍数的数目最大即可(只要在0-l之间寻找即可)
代码:略
2007年10月22日星期一(56)
2051Argus数学题,看起来规模蛮吓人,强暴力过的
题意:有点难懂,呵呵,就是把一个数轴上的一些点初始化为一个值,而这些被初始化的点的倍数也是这个值,现在要求出最早出现的n个值,如果在一个点上有超过一个的值,按值从少到大输出
算法:暴力
代码:略
2546CircularArea数学题
题意:求两个圆的重叠部分的面积
算法:无,就是要非常的小心!
代码:略
2007年10月23日星期二(58)
1654Area几何题
题意:求多边形的面积
算法:叉积求面积
代码:略
1183反正切函数的应用数学题
题意:中文题,意思很好懂!
算法:1/a=(1/b+1/c)/(1-(1/b)*(1/c))
1/a=(b+c)/bc/(1-1/bc)
a=(bc-1)/(b+c)
令m=b+c
则c=m-b;
m=(b^2+1)/(b-a)
令i=b-a
则m=i+2a+(a^2+1)/i//最后表达式
i+(a^2+1)/i>=2*sqrt(a^2+1)
所以:i>=sqrt(a^2+1)或i<=sqrt(a^2+1)
则m>=2*sqrt(a^2+1)+2a
所以可以令i从a开始循环i--;
直到(a^2+1)%i==0再求出m即可
代码:略
2007年10月25日星期四(59)
3435SudokuChecker菜题一个
题意:就是看看一个矩阵里面的每个小矩阵里面的数字有没有重复
算法:暴搜
代码:略
教训:这题WA了n次,原因在于自己偷懒不看题目!
2007年10月26日星期五(60)
1019NumberSequence数学题
题意:一个数字排列,即1,12,123,1234…..,给定一个数n(n刚好在一个整数范围里),要求输出第n位数字
算法:利用函数ltoa(num,str,radix)把相应的数字转化为字符串,然后再逐个数即可
代码:略
辅助:这两天堕落了,一直没做题,敲响警钟!!!
2007年10月29日星期一(63)
3096SurprisingStrings字符串问题
题意:给定一个字符串(长度不超过80),以两个字符下标的差值(1,2,3..)分组,并以这些长度为2的字符串为组的元素,如果在任意一组里面有相同的字符串,则为surprising,否则是notsurprising
算法:暴力,规模不大,好像还是0ns
代码:略
3100RootoftheProblem数学题
题意:给定两个数b(b<1000000)和n(1<=n<=9),现在要算出a的n次幂与b最接近的a
算法:暴力,规模虽然有点大,稍微剪一下枝就过了
代码:略
3095LinearPachinko模拟题
题意:就一个模拟
算法:模拟
代码:略
2007年10月30日星期二(66)
3348Cows凸包
题意:一个农场里有很多的树,现在要以这些树作为支点来围一个面积最大的牧场,已知一只羊至少需要50平方米的草场,问最多可以养几只羊??
算法:凸包
代码:略
1274ThePerfectStall
题意:一个牧场里面有n只奶牛和m个挤奶场,其中一头奶牛可能到一个或几个挤奶场,现在问一次最多能有几个挤奶场同时在使用当中
算法:最大匹配
代码:略
1455CrazyteaParty
题意:有n个人出席并围成一圈的茶会,相邻两个人可以互换位置,现在问最少经过几次交换以后可以使得原来在左边的人跑到右边去
算法:求逆序数:若是线形无环,将1-n变为n-1,求逆序数n*(n-1)/2即可(线性代数)但本题由于是环,则在1-n中取一k,将1-n变为形如k-1,n-(k+1)也可满足条件,比如1,2,3,4,5变为3,2,1,5,4也可满足条件。问题转换为只需确定一k,使逆序数最小。设一k,对于k-1和n-(k-1)分别求逆序数:k-1:k*(k-1)/2n-(k+1):(n-k)*(n-k-1)/2则总共的逆序数为k*(k-1)/2+(n-k)*(n-k-1)/2,根据一元二次方程最低点(-b/2a)求得当k=n/2时该式最小
代码:略
2007年10月31日星期三(68)
3438LookandSay
题意:把看到的一个数字串用说的方式表达出来,如:123就是说有一个一,一个二,一个三,所以结果是111213
算法:模拟题吧
代码:略
3445ElementaryAdditions
题意:数字的用大括号来表示(详见题目),要求输出两个数的和
算法:打表
代码:略
2007年11月1日星期四(71)
1939DiplomaticLicense数学题
题意:很多的国家之间需要互相的通信,而这些国家所在的位置围成一个圆圈,假设每两个相邻的国家需要在一个地方开会,已知每个国家去开会的人每走相同的距离的价钱是一样的,现在要求找出最合适的开会的地方?
算法:其实就是算每两个相邻国家(注意:第一个国家和最后一个国家是相邻的)之间的中点
代码:略
1936AllInAll
题意:给出两个字符串s和t,问s是否可以从t中通过去掉一些字符来得到
算法:暴搜
代码:略
1942PathsonGrid
题意:给出一个n*m的矩阵,有两种走法:一是往右走,二是往上走,现在问从左下角到右上角有几种走法
算法:T路的计数,即(n+m)!/n!*m!
代码:略
附注:T路的计数还没找到相关的资料
2007年11月4日星期日(73)
2140HerdSums数学题
题意:给一个整数n,问有几种方法可使几个连续的数的和等于n
算法:k=(sqrt(1+8*n)-1)/2,即子序列的长度不会超过k.接着从1到k一个一个判断a=(2*n-k*k+k)%(2*k)是否为0,如果是则总数加1,否则继续循环.
代码:略
附注:数学功底太差了,搞本组合数学研究研究!
1922RidetoSchool数学题
题意:Charlie骑车从公寓到教室,首先在公寓门口等同学,当有同学来就跟着他走,如果在路上有比原来这个同学更快,就又跟着他走,问Charlie什么时候到教室
算法:简单的数学题
代码:略
2007年11月5日星期一(76)
1466GirlsandBoys匹配
题意:n个学生里面(没有说明那个是男那个是女),给出每个学生可能的发展对象,问不可能成为情侣的学生的个数?
算法:算出最大匹配数m,答案是n-m/2;
代码:
boolcan(intt)
·{
·for(inti=0;i<n;i++)
·if(used[i]==0&&mat[t][i])
·{
·used[i]=1;
·if(link[i]==0||can(link[i]))
·{
·link[i]=t;
·returntrue;
·}
·}
·returnfalse;
·}
·
·intMaxMatch()
·{
·intcount=0;
·memset(link,0,sizeof(link));
·for(inti=0;i<n;i++)
·{
·memset(used,0,sizeof(used));
·if(can(i))count++;
·}
returncount;
}
1469COURSES匹配
题意:n个学生,p门课程,给出每个学生可以上的课,问是否存在同时有p个学生在分别上这p门课程
算法:就一个匹配
代码:见上
2239SelectingCourses匹配
题意:李明在开学时候选课,已知有n门课程,其中这n门课可能不止讲一次,但就是时间不同。李明很爱学习,请你帮他安排时间选尽可能多的课
算法:还是一个匹配
代码:略
2007年11月10日星期六(77)
1422AirRaid匹配
题意:一个城市的街道全是单向的,其中每两个十字路口都有一条通路连接,现在给出这些十字路口的通路情况,问最少只要几个人即可把所有的十字路口都走遍
算法:匹配算法
代码:略
2007年11月12日星期一(81)
2403HayPoints简单题
题意:已知具备某些才能的一个工人需要工钱若干,现在一个公司要招聘一个工人,其中列出这个工人所必须的才能,问要付给这个工人多少工钱
算法:无
代码:略
1330NearestCommenAncestors简单题
题意:给出一棵树各顶点的连接情况,每个顶点有相应的一个序号,从树根到给出的两个顶点的通路的各顶点中,求离这两个顶点最近的一个顶点
算法:用一个一维数组(滚动数组)记录相应顶点的父节点,求出两个顶点的通路后直接找出最近的那个即可
代码:略
2533LongestOrderedSubsequenceDP
题意:求一个序列的最长递增子序列
算法:简单的DP
代码:略
1887TestingtheCATCHER
题意:求一个序列的最长递减子序列
算法:简单的DP
代码:略
相关文章推荐
- PKU 1026
- 【IDA*(迭代加深)】PKU-2286||HUD-1667-The Rotation Game
- 【IDA*+位运算】PKU-1084-Square Destroyer
- pku 3304 Segments
- PKU 3370 Halloween treats 【鸽笼定理】
- pku 3020 Antenna Placement
- pku1804 Brainman
- pku1183 反正切函数的应用
- 【树形dp】PKU-3107-Godfather
- hdu 1688 Sightseeing (次短路及次短路数)&&pku3255 Roadblocks &&3191 How Many Paths Are There
- pku1944 Fiber Communications
- pku 2503 Babelfish 哈希
- pku 2442 Sequence stl堆的应用
- pku 3009 Curling 2.0 DFS
- pku 1094(拓扑排序,多次拓扑)
- pku1674 Sorting by Swapping
- pku 2531 Network Saboteur DFS
- pku 2954(pick定理的应用)
- PKU 1505 Copying Books
- pku 1850 Code 组合数学排列组合的应用