首页 > 其他 > 详细

26.27日

时间:2020-02-27 20:51:20      阅读:168      评论:0      收藏:0      [点我收藏+]
看java的时候一直看到有  new() new() new()以为是JAVA特有,今天一上老师的数据结构课才知道,new()是C语言里也有的。。
求链表倒数第几个数
一开始想遍历出整个链表大小来记住结尾然后再遍历到结尾-M后来发现可以定义两个指针相隔M位置顺路一直让后面的指针末尾就行了。
 1 ElementType Find( List l, int m )
 2 {
 3     List    start=l,end=l;
 4     while(m--)
 5     {
 6         if(end==NULL)return ERROR;
 7         end=end->Next;
 8     }
 9     while(end!=NULL)
10     {
11         start=start->Next;    
12             end=end->Next;
13     }    
14     return    start->Data;
15 }

 

根据中序后序推出前序
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using    namespace    std;
 5 int        bz=0;
 6 void preonder(int *pos,int *in,int n1)
 7 {
 8     if(n1>0)
 9    {
10     cout<<" "<<pos[n1-1];
11     int tmp=pos[n1-1];
12     int num=-1;
13     for(int i=0;i<n1;i++)
14     {
15         if(in[i]==tmp)
16         {
17             num=i;
18             break;
19         }
20     }
21     preonder(pos,in,num);
22     preonder(pos+num,in+num+1,n1-num-1);
23     }
24 }
25 
26 int main()
27 {
28     int    t;
29     int mid[314],later[314];
30     scanf("%d\n",&t);
31      for(int    i=0;i<t;i++)
32     scanf("%d",later+i);
33     for(int    i=0;i<t;i++)
34         scanf("%d",mid+i);
35     cout<<"Preorder:";
36     preonder(later,mid,t); 
37 }

 

 
习题3.9 堆栈操作合法性 (20分)
 

假设以SX分别表示入栈和出栈操作。如果根据一个仅由SX构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合法的堆栈操作序列。请编写程序,输入SX序列,判断该序列是否合法。

输入格式:

输入第一行给出两个正整数N和M,其中N是待测序列的个数,M(≤)是堆栈的最大容量。随后N行,每行中给出一个仅由SX构成的序列。序列保证不为空,且长度不超过100。

输出格式:

对每个序列,在一行中输出YES如果该序列是合法的堆栈操作序列,或NO如果不是。

一开始还认真的想用堆栈,转头一想,没必要,简单简单。

 1 #include<string.h> 
 2 #include<stdio.h>
 3 char    s[101];
 4 int    main()
 5 {
 6     int    p,t,q;
 7     int    i,j;
 8     scanf("%d%d",&i,&j);
 9     getchar();
10     while(i--)
11     {
12         p=0;
13         gets(s);
14         t=strlen(s);
15         for(q=0;q<t;q++)
16         {
17             if(s[q]==S)p++;
18             if(s[q]==X)p--;
19             if(p<0||p>j)break;
20         }
21         if(p==0)printf("YES\n");
22         else    printf("NO\n");
23     }
24 }
习题3.10 汉诺塔的非递归实现 (25分)
 

借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为“a”)通过借助柱(标记为“b”)移动到目标柱(标记为“c”),并保证每个移动符合汉诺塔问题的要求。

输入格式:

输入为一个正整数N,即起始柱上的盘数。

输出格式:

每个操作(移动)占一行,按柱1 -> 柱2的格式输出。

汉诺塔的非递归形式被我用递归形式给做出来了!!!

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 void shuchu(char A, char C)
 4 {
 5     printf("%c -> %c\n",A,C);
 6 }
 7 void hn(int n,char A,char B,char C)
 8 {
 9     if(n==1)
10     {
11         shuchu(A,C);
12     }
13     else
14     {
15         hn(n-1,A,C,B);
16         shuchu(A,C);
17         hn(n-1,B,A,C);
18     }    
19 }
20 int main()
21 {
22     int n;
23     scanf("%d",&n);
24     char A=a,B=b,C=c;
25     hn(n,A,B,C);
26     return 0;
27 }

Description

Bessie has gone to the mall‘s jewelry store and spies a charm bracelet. Of course, she‘d like to fill it with the best charms possible from the N (1 ≤ N ≤ 3,402) available charms. Each charm i in the supplied list has a weight Wi (1 ≤ Wi ≤ 400), a ‘desirability‘ factor Di (1 ≤ Di ≤ 100), and can be used at most once. Bessie can only support a charm bracelet whose weight is no more than M (1 ≤ M ≤ 12,880).

Given that weight limit as a constraint and a list of the charms with their weights and desirability rating, deduce the maximum possible sum of ratings.

有N(1 ≤ N ≤ 3,402) 件物品和一个容量为V的背包。第i件物品的重量是w[i](1 ≤ Wi ≤ 400),价值是d[i](1 ≤ Di ≤ 100)。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量M(1 ≤ M ≤ 12,880),且价值总和最大。

我最喜欢的简单的01背包问题

 1 #include<string.h> 
 2 #include<stdio.h>
 3 int    we[12881];
 4 int    v[3403];
 5 int    w[3403];
 6 int    main()
 7 {
 8     int    i,j;
 9     while(~scanf("%d%d",&i,&j))
10     {
11         int    t=0;
12         while(t<i)
13         {
14             scanf("%d%d",w+t,v+t); 
15             t++;
16         }
17         for(t=0;t<i;t++)
18         for(int    l=j;l>=w[t];l--)
19             if(we[l-w[t]]+v[t]>we[l])we[l]=we[l-w[t]]+v[t];
20         printf("%d\n",we[j]);
21         
22     }
23 }

现在我们有N个种类的食物,它们有不同的售价和能量. 但是Sunny手上的钱是有限的。在这个弱肉强食的世界,Sunny想要变强,因此需要能量升级,才能在这个世界上生存,为了让Sunny能够干掉更多等级低下的Boss,聪明的你帮帮Sunny怎样去获取能量?

还是俺最爱的01背包,感觉就是西邮的题目copy过来,

 1 #include<string.h> 
 2 #include<stdio.h>
 3 int    we[12881];
 4 int    v[3403];
 5 int    w[3403];
 6 int    main()
 7 {
 8     int    time;
 9     scanf("%d",&time);
10     while(time--)
11     {
12         memset(we,0,sizeof(we));
13         int    i,j,t;
14         scanf("%d%d",&i,&j);
15         t=0;
16             while(t<i)
17         {
18             scanf("%d",v+t); 
19             t++;
20         }
21         t=0;
22             while(t<i)
23         {
24             scanf("%d",w+t); 
25             t++;
26         }
27         for(t=0;t<i;t++)
28         for(int    l=j;l>=w[t];l--)
29             if(we[l-w[t]]+v[t]>we[l])we[l]=we[l-w[t]]+v[t];
30         printf("%d\n",we[j]);
31         
32     }
33 }

 

可怜的POIUYTREWQ最近想买下dota2的商品,但是手头缺钱。他想起了之前看过的一部大片,觉得抢银行也许是个不错的选择。他认为,坏人被抓是因为没有预先规划。于是他在之前的几个月对各大银行进行了一次评估; 评估内容包括安全性和可盗窃金额: 他想知道在在某个风险系数下可以偷窃的最大金额 

Input第一行给出了一个整数T, 表示有T组测试数据. 对于每一组数据,第一行给出了一个浮点数P, 表示POIUYTREWQ允许被抓的最大概率, 和一个整数N,表示他计划去抢劫的N个银行. 接下来N行, 每行给出一个整数数Mj和浮点数Pj. 
抢劫银行 j 可获得 Mj 百万美金, 被抓的概率是 Pj .Output对于每组数据,每行输出一个整数,表示POIUYTREWQ在被抓概率小于P的情况下,可抢到的最多的金钱。 

Notes and Constraints 
0 < T <= 100 
0.0 <= P <= 1.0 
0 < N <= 100 
0 < Mj <= 100 
0.0 <= Pj <= 1.0 
你可以认为每家银行都是独立的。Sample Input

3
0.04 3
1 0.02
2 0.03
3 0.05
0.06 3
2 0.03
2 0.03
3 0.05
0.10 3
1 0.03
2 0.02
3 0.05

Sample Output

2
4
6
 1 #include<cmath>
 2 #include<cstring>
 3 #include "stdio.h"
 4 #include "iostream"
 5 using namespace std;
 6 double    s[10001];
 7 int    va[10001];
 8 double    we[10001];
 9 int    main()
10 {
11     int    time;
12     scanf("%d",&time);
13     while(time--)
14     {
15         double    wei;
16         int    ti;
17         int    sum=0;
18         scanf("%lf%d",&wei,&ti);
19         memset(s,0,sizeof(s));
20         memset(va,0,sizeof(va));
21         memset(we,0,sizeof(we));
22         for(int    i=1;i<=ti;i++)
24         scanf("%d%lf",va+i,we+i);
25         for(int    i=1;i<=ti;i++)
26         sum+=va[i];
28         s[0]=1;
29         for(int    i=1;i<=ti;i++)
30         {
31             for(int    j=sum;j>=va[i];j--)
32             s[j]=max(s[j],s[j-va[i]]*(1.0-we[i]));
33         }
34         for(int    i=sum;i>=0;i--)
35         {
36             if(wei>(1-s[i]))
37             {
38                 printf("%d\n",i);
39                 break;
40             }
       }      
46     }
47 }

 

26.27日

原文:https://www.cnblogs.com/johnfllora/p/12374034.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!