摘要: 求存在的最小价值的多重背包
阅读全文
posted @
2012-03-12 20:16 Leo.W 阅读(234) |
评论 (0) |
编辑 收藏
摘要: 水题一道,但让我明白不必将所有结果(也不可能包括所有)算出来,只需要具体问题具体对待。
阅读全文
posted @
2012-03-09 21:08 Leo.W 阅读(236) |
评论 (0) |
编辑 收藏
摘要: 一道精彩的多重背包,思路不古板。适合初学者。
阅读全文
posted @
2012-03-09 20:14 Leo.W 阅读(300) |
评论 (0) |
编辑 收藏
摘要: 简单贪心,但蕴含思想却以小见大,可以举一反三
阅读全文
posted @
2012-03-08 19:05 Leo.W 阅读(175) |
评论 (0) |
编辑 收藏
1 /*
2 Author: Leo.W
3 Descriptipn: 计算N^N结果的最左边的数
4 How to Do: 数学题 由sum=N^N,两边对10取对数,log10(sum)=Nlog10(N),有sum=10^(Nlog10(N));
5 由于10的整数次幂首位均为1,则仅需考虑Nlog10(N)的结果的小数部分即可
6 */
7 #include <stdio.h>
8 #include <math.h>
9 int main(){
10 //freopen("in.txt","r",stdin);
11 int t;
12 __int64 num,sum2;
13 scanf("%d",&t);
14 while(t--){
15 scanf("%I64d",&num);
16 double sum1=num*log10(double(num));
17 sum2=(__int64)sum1;
18 sum1-=sum2;
19 num=(__int64)pow(10.0,sum1);
20 printf("%I64d\n",num);
21 }
22 return 0;
23 }
posted @
2012-03-08 18:56 Leo.W 阅读(852) |
评论 (1) |
编辑 收藏
摘要: 完全背包问题
阅读全文
posted @
2012-03-07 15:03 Leo.W 阅读(513) |
评论 (3) |
编辑 收藏
1 /*
2 Author: Leo.W
3 Descriptipn:寻找质因数仅为2、3、5、7其中若干的正整数
4 How to Do: 动态规划,由2、3、5、7开始依次叠増;
5 */
6 #include <stdio.h>
7 #include <string.h>
8 int num[5900];
9 inline int min(int a,int b){
10 if(a<b) return a;
11 return b;
12 }
13 int main(){
14 //freopen("in.txt","r",stdin);
15 int i,t=1,p2=1,p3=1,p5=1,p7=1;//表示当前递增依次为2、3、5、7
16 char ch[5][3]={"th","st","nd","rd"};
17 for(i=1;i<=5842;i++){
18 num[i]=t;
19 t=min(min(num[p2]*2,num[p3]*3),min(num[p5]*5,num[p7]*7));
20 if(t==num[p2]*2)
21 p2++;
22 if(t==num[p3]*3)
23 p3++;
24 if(t==num[p5]*5)
25 p5++;
26 if(t==num[p7]*7)
27 p7++;
28 }
29 while(scanf("%d",&t),t){
30 i=0;
31 if(t%100!=11&&t%10==1)
32 i=1;
33 if(t%100!=12&&t%10==2)
34 i=2;
35 if(t%100!=13&&t%10==3)
36 i=3;
37 printf("The %d%s humble number is %d.\n",t,ch[i],num[t]);
38
39 }
40 return 0;
41 }
posted @
2012-03-07 14:55 Leo.W 阅读(196) |
评论 (0) |
编辑 收藏
1 /*
2 Author: Leo.W
3 Descriptipn: 给定几个顶点以及已知某几个顶点存在通路,求最少还需几条路即可完成连通图
4 How to Do: 由最后一组测试数据易知999 0,且结合最小生成树的知识可得,连通分量数减一即得解
5 */
6 #include <iostream>
7 #include <stdio.h>
8 #include <string.h>
9 using namespace std;
10 #define MAXSIZE 1000
11 int path[MAXSIZE][MAXSIZE];
12 bool appear[MAXSIZE];
13 bool chose[MAXSIZE];
14 int m,n,lt;//图中连线后的连通分量数
15
16 void bfs(int num){
17 chose[num]=true;
18 int i;
19 for(i=1;i<=m;i++)
20 if(i!=num&&path[num][i]==0&&!chose[i]){//点i与点num有连线,并且点i还未被选入集合
21 lt--; bfs(i);
22 }
23 }
24 int main(){
25 //freopen("in.txt","r",stdin);
26 while(scanf("%d",&m),m){//城镇数
27 scanf("%d",&n);//已有的公路条数
28 lt=m;
29 memset(appear,false,MAXSIZE);
30 memset(chose,false,MAXSIZE);
31 int i,j;
32 for(i=1;i<=m;i++){
33 for(j=1;j<=m;j++)
34 path[i][j]=MAXSIZE;
35 }
36 for(i=0;i<n;i++){
37 int begin,end;
38 scanf("%d%d",&begin,&end);
39 appear[begin]=appear[end]=true;//表示已经连上线的点,即已经出现
40 path[begin][end]=path[end][begin]=0;
41 }
42 for(i=1;i<=m;i++)
43 if(appear[i]&&!chose[i]){
44 bfs(i);
45 }
46 printf("%d\n",lt-1);
47 }
48 return 0;
49 }
posted @
2012-03-06 13:38 Leo.W 阅读(122) |
评论 (0) |
编辑 收藏
1 /*
2 Author: Leo.W
3 Descriptipn: 给定几个顶点以及各顶点间的距离,求连接所有顶点的所需的最短距离。
4 How to Do: 基础的最小生成树问题。易知此为稠密图,故使用普里姆算法解题。
5 */
6 #include <iostream>
7 #include <stdio.h>
8 #include <string.h>
9 using namespace std;
10
11 #define MAXSIZE 100
12 int closePath[MAXSIZE];
13 int path[MAXSIZE][MAXSIZE];
14 bool chose[MAXSIZE];
15 int n;//顶点数
16
17 int prim(int a){
18 chose[a]=true;
19 int i,sum=0,num=n-1,pos=a;
20 for(i=1;i<=n;i++) closePath[i]=path[a][i];
21 while(num){
22 int mins=10000000;
23 for(i=1;i<=n;i++){
24 if(!chose[i]&&closePath[i]<mins){
25 mins=closePath[i];
26 pos=i;
27 }
28 }
29 num--; sum+=mins;
30 chose[pos]=true;
31 for(i=1;i<=n;i++){
32 if(!chose[i]&&closePath[i]>path[pos][i]){
33 closePath[i]=path[pos][i];
34 }
35 }
36 }
37 return sum;
38 }
39 int main(){
40 //freopen("in.txt","r",stdin);
41 while(scanf("%d",&n),n){
42 if(n==1) printf("0\n");
43 else{
44 memset(chose,false,MAXSIZE);
45 int i,j,pathSum=n*(n-1)/2;
46 for(i=1;i<=n;i++){
47 for(j=1;j<=n;j++){
48 if(i==j) path[i][j]=0;
49 else path[i][j]=10000000;
50 }
51 }
52 for(i=1;i<=pathSum;i++){
53 int begin,end,len;
54 scanf("%d%d%d",&begin,&end,&len);
55 if(len<path[begin][end])
56 path[begin][end]=path[end][begin]=len;
57 }
58 printf("%d\n",prim(1));
59 }
60 }
61 return 0;
62 }
posted @
2012-03-05 18:30 Leo.W 阅读(168) |
评论 (0) |
编辑 收藏
1 /*
2 Author: Leo.W
3 Descriptipn: 给定图上的n个点及m条点间连线,试求从S点到W点的最短距离,若不存在,则输出-1;
4 How to Do: 经典的最短路算法的应用,dijkstra算法自编写
5 */
6 #include <iostream>
7 using namespace std;
8 int n,m;//点的个数,点间连线的条数
9 int path[205][1005];
10 bool node[205];
11 int Dijkstras(int s,int w){
12 int i,j;
13 node[s]=true;
14 for(i=0;i<n;i++){
15 int mins=INT_MAX,pos=s;
16 for(j=0;j<n;j++){//寻找为选入点的最小值
17 if(!node[j]&&mins>path[s][j]){
18 mins=path[s][j]; pos=j;
19 }
20 }
21 if(mins==INT_MAX||j>n) break;
22 node[pos]=true;
23 for(j=0;j<n;j++){
24 if(!node[j]&&path[pos][j]!=INT_MAX&&path[s][j]>path[s][pos]+path[pos][j]){
25 path[s][j]=path[s][pos]+path[pos][j];
26 path[j][s]=path[s][j];
27 }
28 }
29 }
30 return path[s][w];
31 }
32 int main(){
33 //freopen("in.txt","r",stdin);
34 while(scanf("%d%d",&n,&m)!=EOF){
35 int i,j;
36 for(i=0;i<n;i++){
37 node[i]=false;
38 for(j=0;j<n;j++){
39 if(j==i) path[i][j]=0;
40 else path[i][j]=INT_MAX;//表示两点间无通路
41 }
42 }
43 for(i=0;i<m;i++){
44 int begin,end,len;
45 scanf("%d%d%d",&begin,&end,&len);
46 if(len<path[begin][end])//此处是全题关键,WA了很久。。。。【审题要细致啊】
47 path[begin][end]=path[end][begin]=len;//双向赋值
48 }
49 int s,w;
50 scanf("%d%d",&s,&w);
51 if(s>w){
52 s=s^w;w=s^w;s=s^w;
53 }
54 if(s==w)
55 printf("0\n");
56 else{
57 int ans=Dijkstras(s,w);
58 if(ans==INT_MAX) printf("-1\n");
59 else printf("%d\n",ans);
60 }
61 }
62 return 0;
63 }
posted @
2012-03-04 12:30 Leo.W 阅读(232) |
评论 (0) |
编辑 收藏