2021.11.28学习总结

总览:

7:00~9:00把昨天菜鸟杯的题重写了一遍。

9:00~12:00在图书馆写高数和专业导论作业。

2:30~6:00刷vj上的题。

7:00~10:00 看了一下贪心算法(人给我看傻了,只知道它是为了达到局部最优解,但是不知道怎么用),因此展开看到了动态规划(解决重叠问题),分治法,这3个东西是一家的,如果学会了其中一个,另外两个应该不难理解。还看了高数预习了明天要上的课,毕竟不提前学习的话上课就要听不懂了。

听学长讲指针还说到了栈,原来栈跟指针这么像,好像又懂了一点知识,还知道了为什么要用指针,指针的原理(一维指针二维指针)。三维就很强(int (*p)[2][3]==int a[1][2][3])

一、个别菜鸟杯的题解,重新写了,太多了,下一个总结在写一些。

1.题目

问题 A: 白兰王

描述

吉首大学优秀大学生小勋很努力,很优秀,但是现在他想要成为白兰鸽,开始摆烂了。

此时另一位三好学生大鹏也决定开摆,为了争夺吉首大学白兰王,他们决定决一死战,决战内容如下:有一个字符串 S ,只包含数字 0−9 ,且长度为奇数,两人轮流选择字符串中的一个数字删掉,当字符串只剩下 11 个字符时游戏结束。如果最后字符串开头的数字是 2 ,则小勋获胜,否则大鹏获胜。

小勋先手(因为他是吉首大学优秀大学生),两人都希望自己能成为本届白兰王,并且保证两人都会做出最优决策,问最后谁能获得这至高无上的称号。

格式

输入格式

第一行输入一个整数 n(13≤n≤105) 代表字符串S的长度,保证n为奇数

第二行输入字符串 S

输出格式

若小勋获胜,输出 yyds ,若大鹏获胜,输出 orz。

样例略。

这是今天才想出来的,比赛的时候没想到。

思路:

因为题目要求当数只剩下11个的时候比赛就结束了,所以只需要用我们输入数的长度减掉11,就是我们要执行的次数,因为是两个人,一人执行一次,在多加一次,就能知道是2和不是2的数哪个跟多,如果是2和不是2分别计数,最后比较2的个数是不是大于不是2的个数,如果2的个数大于不是2的个数,那么就是yyds,否则orz。(注意输入数和字符间一定要加个getchar();不然怎么都不对)。

AC代码:

#include
char s[100010];
int main()
{
	long long n;
	int i,j,k,x=0,y=0; 
     scanf("%lld",&n);
     getchar();
      for(i=0;i

2.题目

问题 G: 存钱

描述

牛子爷赚了钱想存进T银行,但是T银行是7进制银行,里面的存款都是用7进制显示的.
牛子爷每次存完钱之后,不知道自己现在在银行的存款是多少
因为他不会10进制转换成7进制。
聪明的你,能帮帮牛子爷嘛?

格式

输入格式

输入一个数T代表有T组测试样例(1<=t<=1000)
第一行是两个正整数n,m(n代表牛子爷存这笔钱之前在T银行的存款(牛子爷在上次在T银行存款时看的),m代表牛子爷要存的钱的数量)
(0<=n<=10^6,0<=m<=10^6)


注意  n是7进制的数,m是10进制的数

输出格式

牛子爷在存完这笔钱之后在T银行的存款

思路:把n转成100进制数,在加上m,用相加完的数在转成7进制数(转7进制跟转二进制同理),最后输出。

AC代码:

#include
#include
int main()
{
	int t,a[1010];
	long long n,m,s,x,y,sum,s1,i,t1;
	scanf("%d",&t);
	while(t--)
	{
		s=0;x=0;y=0;t1=0;
		scanf("%lld%lld",&n,&m);
		//把n转成10进制 
		while(n)
		{
			s+=n%10*pow(7,x);
			n/=10;
			x++;
		}
		s1=s+m;
		//把s1转成7进制 
		while(s1)
		{
			a[y++]=s1%7;
			s1/=7;
		}
		//合在一起输出 
		for(i=y-1;i>=0;i--)
		{
		sum=t1*10+a[i];
		t1=sum;
	   }
	   printf("%lld\n",sum);
	}
}

二、高数就是看宋浩老师yyds,讲的真好,专业导论就是写我们这学期的期末考试作业。

三、vj上的做会一题能解决所有问题,都很类似,今天下午因为陈姝玥学姐的指导,一下就学会了,把结构体里的题目写完了。

这是其中一题。

题目:结构体训练 - Virtual Judge (vjudge.net)

思路:先按长度从大到小排序,如果长度一样大就按粗细从小到大排,如果一样细就按编号从大到小排,排完之后输出最上面的编号就可以了。

AC代码:

#include
struct  G
{
	int l;
	int t;
	long long b;
}p[1010];
int main()
{
	  int n,i,j;
	  struct  G temp1;
	  struct  G temp;
	  scanf("%d",&n);
	  for(i=0;ip[j+1].t)
		   	    {
		   	    	temp=p[j];
		   	    	p[j]=p[j+1];
		   	    	p[j+1]=temp;
				 }
				 else if(p[j].t==p[j+1].t)
				 {
				 	 if(p[j].b

四、这是我看到的理论知识,具体怎么用还在学习

分治法:

基本思想:
将问题分解成多个子问题,并允许不断分解,使规模越来越小,最终可用已知的方法求解足够小的问题。

使用要求:
(1) 问题能够按照某种方式分解成若干个规模较小、相互独立且与原问题类型相同的子问题。
(2) 子问题足够小时可以直接求解。
(3) 能够将子问题的解组合成原问题的解。

贪心法:

基本思想:
总是选择当前最优解,并不考虑整体最优。
特点:
拥有最优子结构特性。当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征。

动态规划法:

基本思想:将较大问题分解为较小的同类子问题,这一点上它与分治法和贪心法类似。动态规划法解决子问题重叠现象,利用最优子结构,自底向上从子问题的最优解逐步构造出整个问题的最优解。

适用动态规划法的要求:具有最优子结构特性和重叠子问题。

今天是很充实的一天,而且还学到了,之前写结构体的时候每次交换都会把里面的成员一个个交换一遍,特别繁琐,但是今天我发现根本没必要,代码都减少了很多。

学长讲课太好了,讲的很细,给他点个赞。希望下次他接着讲。

                                                        学习使我快乐,明天加油。

2021.11.28学习总结_第1张图片

 

你可能感兴趣的:(c语言,算法)