第三周 周报

本周就刷了题 刷了题 刷了题

一.
有一只小鱼,它平日每天游泳 250 公里,周末休息(实行双休日),假设从周 x(1\le x \le 7)x(1≤x≤7) 开始算起,过了 n(n\le 10^6)n(n≤10
6
) 天以后,小鱼一共累计游泳了多少公里呢?

输入格式
输入两个整数x,n(表示从周x算起,经过n天)。

输出格式
输出一个整数,表示小鱼累计游泳了多少公里。

输入输出样例
输入 #1 复制
3 10
输出 #1 复制
2000

#include<stdio.h>
#include<string.h>
#include<math.h> 
int main()
{
	int x=0,t=0,y=0,s=0,n,m;
	scanf("%d %d",&n,&m);
      	t=m/7*5;               //计算m天中  包含几周//
      	y=m%7;               //剩下的几天(小于1周)//
      	x=n+y-1;            //加上剩下的看走到了周几//
      	if(x==6)
      	t=t+y-1;              //周6减1天//
      	else if(x>=7)
      	t=t+y-2;
      	else
        t=t+y;
      	if(n==7)              //如果从周7开始会少1天所以最后要加1//
      	printf("%d",(t+1)*250);
      	else
      	printf("%d",t*250);
} 

一开始考虑这个题的时候,想着用for取便利每一天,结果是中sb的作法,最后在大佬的要求下,用if else 解决了这个问题,先求出所给天数中的游泳天数,紧接着剩下的天数,进行判断之后,再加起来,乘250,就很帮!

掷硬币

从前有很多个硬币摆在一行,有正面朝上的,也有背面朝上的。正面朝上的用1表示,背面朝上的用0表示。现在要求从这行的第一个硬币开始,将前若干个硬币一起翻面,问如果要将所有硬币翻到正面朝上,最少要进行这样的操作多少次?

输入格式
一个字符串,由0和1组成,表示硬币状态

输出格式
一个数,表示要翻转的最少次数

输入输出样例
输入 #1 复制
10
输出 #1 复制
2
说明/提示
样例1说明:

第1次翻转:把第一个硬币翻到反面,字符串为00

第2次翻转:把第一、二个硬币一起翻到正面,字符串为11,翻转完成,输出2

硬币个数<=10000

#include<stdio.h>
#include<string.h> 
int main()
{
	int m,t=0,i,j; 
	char a[10000];
	gets(a);
	m=strlen(a); 
	for(i=0;i<m-1;i++)
	{
		if(a[i]=='1'&&a[i+1]=='0')
		t+=2;	 
	}
	if(a[0]=='0')
	t++;
	printf("%d",t); 
} 

这个题我不会,和超超学长看了后,才大概懂了。
这个题如果写多一点会发现规律,最后翻的只是10这个模式
这个模式翻两次,如果一开始是0的话,那么这个if部分会自动认为他是1,所以在最后加次数的时候 如果字符串的首位是0 则要加以 反之不加!

感觉很难的题目,但是数据很弱。

一个大小为N*M的城市遭到了X次轰炸,每次都炸了一个每条边都与边界平行的矩形。

题目描述
在轰炸后,有Y个关键点,指挥官想知道,它们有没有受到过轰炸,如果有,被炸了几次,最后一次是第几轮。

输入格式
第一行,四个整数:n、m、x、y。

以下x行,每行四个整数:x1、y1、x2、y2,表示被轰炸的矩形的左上角坐标和右下角坐标(比如1 3 7 10就表示被轰炸的地方是从(1,3)到(7,10)的矩形)。

再以下y行,每行两个整数,表示这个关键点的坐标。

输出格式
共y行,

每行第一个字符为Y或N,表示是否被轰炸,若为Y,在一个空格后为两个整数,表示被炸了几次和最后一次是第几轮。

输入输出样例
输入 #1 复制
10 10 2 3
1 1 5 5
5 5 10 10
3 2
5 5
7 1
输出 #1 复制
Y 1 1
Y 2 2
N
说明/提示
数据很弱!!!直接模拟!!!!

1<=N,M<=100

#include<stdio.h>
int a[101],b[101],c[101],d[101],e[101],f[101],l[100],as[100]; 
int main()
{
	int n,i,m,x,y,z,j,r; 
	scanf("%d %d %d %d",&n,&m,&x,&y);
	for(i=0;i<x;i++)
	{
	   scanf("%d %d %d %d",&a[i],&b[i],&c[i],&d[i]); 
	} 
	for(i=0;i<y;i++)
	{
		scanf("%d %d",&e[i],&f[i]); 
	} 
	for(i=0;i<x;i++)
	{
		for(j=a[i];j<=c[i];j++)
		  for(z=b[i];z<=d[i];z++)
		  {
		  	for(r=0;r<y;r++) 
		  	{
			  if(j==e[r]&&z==f[r])
			  {
			  	l[r]++;
				as[r]=i+1; 
			  }
			} 
		  } 
	}
	for(i=0;i<y;i++)
	{
		if(l[i]==0)
		printf("N\n");
		else
		printf("Y %d %d\n",l[i],as[i]); 
	} 
} 

看了这个代码,是不是绝对这个人他妈的智障,对没错,是这样的。思考这个题的时候看到提示给的数据很弱,回眸一笑,用两个for代表(x,y),进行不断的搜索,这样就可以找到要轰炸的点是否被轰炸过,和是第几次轰炸,当定义全局变量时,系统会给他自动赋给初值0,这样就不用赋值很方便。奥利给。

字符串的输入

这道题没什么难度就是一个字符串的输入搞蒙了我…太菜了.在这里插入代码片
**【题目描述】**三个整数分别为 A , B , C . 这三个数字不会按照这样的顺序给你,但它们始终满足条件: A<B<C . 为了看起来更加简洁明了,我们希望你可以按照给定的顺序重新排列它们。

**【输入格式】**第一行包含三个正整数 A , B 和 C ,不一定是按这个顺序。这三个数字都小于或等于100。第二行包含三个大写字母 “A” 、 “B” 和 “C” (它们之间_没有 _空格)表示所需的顺序.

**【输出格式】**在一行中输出A,B和C,用一个’ '(空格)隔开.

感谢@smartzzh 提供的翻译

输入输出样例
输入 #1 复制
1 5 3
ABC
输出 #1 复制
1 3 5
输入 #2 复制
6 4 2
CAB
输出 #2 复制
6 2 4

#include<stdio.h>
int main()
{
	int a[30];
	char b[30];
	int i,j,t;
	for(i=0;i<3;i++)
	{
		scanf("%d",&a[i]);
	}
		scanf("%s",b);
	for(i=0;i<2;i++)
		for(j=i+1;j<3;j++)
		{
			if(a[i]>a[j])
			{
				t=a[i];
				a[i]=a[j];
				a[j]=t;
			}
		}
		for(i=0;i<2;i++)
		{
			if(b[i]=='A')
				printf("%d ",a[0]);
			if(b[i]=='B')
				printf("%d ",a[1]);
			if(b[i]=='C')
				printf("%d ",a[2]);
		}
		if(b[2]=='A')
				printf("%d",a[0]);
		if(b[2]=='B')
				printf("%d",a[1]);
		if(b[2]=='C')
				printf("%d",a[2]);
		return 0;
}

首先是进行排序,然后最小的是A要输出的,最大的是C要输出的,中间的是B要输出的。再输入过程中,如果前面是数字,换行时 回车也会被当做字符处理,所以如果要用gets函数进行输入,前面最好有个getchar()进行收了多余字符,不然的话 会很麻烦

这道题用到了快排,不太懂。但看了看

在你的养牛场,所有的奶牛都养在一排呈直线的牛栏中。一共有n头奶牛,其中第i头牛在直线上所处的位置可以用一个整数坐标pi(0<=pi<=108)来表示。在无聊的日子里,奶牛们常常在自己的牛栏里与其它奶牛交流一些八卦新闻。每头奶牛发出的声音响度是一样的,而由于声波的能量衰减,某头奶牛发出的声音只能被与它距离不超过d(0<=d<=104)的奶牛所听到,这样这对奶牛就称为可以相互交流的。现在给出所有奶牛的位置和声音所能传播的最远距离d,请你编个程序来计算你的养牛场里究竟有多少对可以相互交流的奶牛。

输入格式
第1行包含两个整数n,d。

第2行包含n个整数,每个整数都是一个坐标pi,描述一头奶牛在直线上的位置。

输出格式
一个数,表示养牛场中可以相互交流奶牛的对数。

输入输出样例
输入 #1 复制
5 10
10 12 16 37 40
输出 #1 复制
4
说明/提示
数据规模

对于40%的数据,n<=10^3;

对于100%的数据,n<=10^6

#include<stdio.h>
#include<stdlib.h>
int a[1000005]; 

int comp(const void*a,const void*b)
{
    return *(int*)a-*(int*)b;
}

int main()
{
  	  int n,t,i,j,m,x=0,f;
	  scanf("%d %d",&n,&m);
	  for(i=0;i<n;i++)
	  scanf("%d",&a[i]);
      qsort(a,n,sizeof(int),comp);
       for(i=0;i<n;++i)
         for(j=i+1;j<n;++j)
       {
          if(a[j]-a[i]>m)
           break;
           else
		   x++;
       }
	printf("%d",x); 
	  return 0; 
} 

qsort是c语言排序函数,

void quicksort(int left,int right)
{int i,j,t,temp;
if(left>right)
return;
temp=a[left];
i=left;
j=right;
while(i!=j)移动   交换
{
    while(a[j]>=temp&&i<j)
    {
        j--;
    }
    while(a[i]<=temp&&i<j)  
    {
        i++;
    }
    if(i<j)
    {
        t=a[i];
        a[i]=a[j];
        a[j]=t;
    }
}
a[left]=a[i];   //交换两个数//
a[i]=temp;
quicksort(left,i-1); //对左边进行排序//
quicksort(i+1,right); //对右边进行排序//
return;
}

这个是快排的函数代码
思想:
一串数中 先定义第一个为最做边temp 然后定义两个变量,从最后一个开始向前找,找到一个比temp小的就停下来,然后从左边找找到一个大于temp的数停下来然后交换a[i]和a[j],然后继续直到i=j,然后交换TEMP 和 a[j]的值,以a[i]为分界可以划分为两个部分,然后继续定义最左边为TEMP 然后继续进行排序,这样排下来,a[i]左边全是比他小的数,右边全是比他大的数。这样对左边继续排,对右边继续排,这样最后一左边的大于右边的标号结束递归,就可排好了。小弟愚钝,还望大佬指点

这道题如果用正常的排序会超时 时间复杂度太高,而快排效率快 , 时间复杂度低 ,很棒!!

单词覆盖还原

一个长度为 l(3\le l\le255)l(3≤l≤255) 的字符串中被反复贴有 boy 和 girl 两单词,后贴上的可能覆盖已贴上的单词(没有被覆盖的用句点表示),最终每个单词至少有一个字符没有被覆盖。问贴有几个 boy 几个 girl?

输入格式
一行被被反复贴有boy和girl两单词的字符串。

输出格式
两行,两个整数。第一行为boy的个数,第二行为girl的个数。

输入输出样例
输入 #1 复制
…boyogirlyy…girl…
输出 #1 复制
4
2

#include<stdio.h>
#include<string.h> 
int main() 
{
	int n,i,boy=0,girl=0; 
	char a[256];
	gets(a);
	n=strlen(a); 
	for(i=0;i<n;i++)
	{
		if(a[i]=='b'||a[i+1]=='o'||a[i+2]=='y')
		boy++;
		if(a[i]=='g'||a[i+1]=='i'||a[i+2]=='r'||a[i+3]=='l')
		girl++; 	 
	} 
	printf("%d\n%d",boy,girl); 
} 

…boyogirlyy…girl… 这个是样例
我觉得这道题还挺难的 , 而这种思想的话就是暴力搜索 虽然很暴力 但还是有很强的思维在里面的,很强! 就是通过看一连串的字符是不是boy 和girl 对每个进行判断,就算是覆盖也可以计算出来他实际个数

车厢重组

类似于冒泡
在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转。一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转180180度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排列车厢的顺序。于是他就负责用这座桥将进站的车厢按车厢号从小到大排列。他退休后,火车站决定将这一工作自动化,其中一项重要的工作是编一个程序,输入初始的车厢顺序,计算最少用多少步就能将车厢排序。

输入格式
共两行。

第一行是车厢总数N( \le 10000)N(≤10000)。

第二行是NN个不同的数表示初始的车厢顺序。

输出格式
一个整数,最少的旋转次数。

输入输出样例
输入 #1 复制
4
4 3 2 1
输出 #1 复制
6

int main()
{
   int n,z,t=0,a[10000],i,j;
   scanf("%d",&n);
   for(i=0;i<n;i++)
   scanf("%d",&a[i]);
   for(i=0;i<n-1;i++)
    for(j=0;j<n-1-i;j++)
      if(a[j]>a[j+1])
      {
      	z=a[j+1];
      	a[j+1]=a[j];
      	a[j]=z;
      	t++;
      }
    printf("%d",t);
    return 0;
} 

可以把每次的交换看成冒泡交换,完整的进行一次冒泡排序就可以出答案了,对 是这样的!

哥德巴赫猜想

输入一个偶数 N(N<=10000)N(N<=10000),验证4~N所有偶数是否符合哥德巴赫猜想:任一大于 2 的偶数都可写成两个质数之和。如果一个数不止一种分法,则输出第一个加数相比其他分法最小的方案。例如 10,10=3+7=5+5,则 10=5+5 是错误答案。

输入格式
第一行N

输出格式
4=2+2 6=3+3 …… N=x+y

输入输出样例
输入 #1 复制
10
输出 #1 复制
4=2+2
6=3+3
8=3+5
10=3+7

#include<stdio.h>
int zhi(int a)
{
	int i,j;
	for(i=2;i<a;i++)
	if(a%i==0)
	break;
	if(i==a)
	return 1; 
	else
	return 0; 
} 
int qun(int s)
{
	int i; 
	for(i=2;i<s;i++)
	{
		if(zhi(i)==1&&zhi(s-i)==1)
		{
			printf("%d=%d+%d\n",s,i,s-i);
			break; 
		} 
	}
	return 0; 
} 
int main()
{
   int n,i,z,j;
   scanf("%d",&n);
   for(i=4;i<=n;i=i+2)
   {
   	 qun(i);
   } 
} 

很灵活的一道题,例如 6 = 3 + 3,如果一个数一个数的找的话会很麻烦,可以先找到一个素数然后用目标数减去找的数,然后判断这个数是不是素数就可以了,很灵活,很棒!!

低洼地,

一组数,分别表示地平线的高度变化。高度值为整数,相邻高度用直线连接。找出并统计有多少个可能积水的低洼地?

如图:地高变化为 0 1 0 2 1 2 0 0 2 0

输入格式
两行,第一行n,表示有n个数。第2行连续n个数表示地平线高度变化的数据,保证首尾为0。(3<=n<=10000,0<=高度<=1000)

输出格式
一个数,可能积水低洼地的数目。

输入输出样例
输入 #1 复制
10
0 1 0 2 1 2 0 0 2 0
输出 #1 复制
3

#include<stdio.h>
int main()
{
	int n,a[10000],i,j,flag=0,t=0 ;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	scanf("%d",&a[i]);
     for(i=1;i<n;i++)
     {
     	if(a[i-1]>=a[i])
		 {
		 	while(a[i]>=a[i+1]&&i<n-1)
			 i++;
			 if(i!=n-1)
			 t++; 
		 } 
	 } 
	 printf("%d",t); 
	  
} 

只判断递减的那些数,当他不再递减时就说一个谷底,然后看他是不是增,横巧妙 很棒!

6.时间换算,很简单的一道题
伦敦奥运会要到了,小鱼在拼命练习游泳准备参加游泳比赛,可怜的小鱼并不知道鱼类是不能参加人类的奥运会的。

这一天,小鱼给自己的游泳时间做了精确的计时(本题中的计时都按24小时制计算),它发现自己从a时b分一直游泳到当天的c时d分,请你帮小鱼计算一下,它这天一共游了多少时间呢?

小鱼游的好辛苦呀,你可不要算错了哦。

输入格式
一行内输入 4 个整数,分别表示 a, b, c, d。

输出格式
一行内输出 2 个整数 e 和 f,用空格间隔,依次表示小鱼这天一共游了多少小时多少分钟。其中表示分钟的整数 f 应该小于60。

输入输出样例
输入 #1 复制
12 50 19 10
输出 #1 复制
6 20
说明/提示
对于全部测试数据,0\le a,c \le 240≤a,c≤24,0\le b,d \le 600≤b,d≤60,且结束时间一定晚于开始时间。

#include<stdio.h>
int main()
{
	int a,b,c,d,s,m;
	scanf("%d %d %d %d",&a,&b,&c,&d);
	 if(a==c)
	 {
	 	s=0;
		 m=d-b; 
	 }
	 else
	 {
	 	s=c-a-1;
		 m=60-b+d;
		 if(m>=60)
		 {
		 	s=s+1;
			 m=m-60; 
		 } 
	 } 
	 printf("%d %d",s,m); 
	 
	  return 0; 
} 

7.很水的一道题!没有什么技巧,多想几个例子就行
再来看一道题,他没什么难度,但是很细
算完钱后,月落乌啼想着:“你TMD坑我,(以下用闽南语读)归粒靠杯靠亩诶,(以下用英读)是伊特游!”于是当爱与愁大神问多少钱时,月落乌啼说了一堆乱码。爱与愁大神说:“算了算了,我只问第n样菜价格多少?”月落乌啼写出了:

。由于爱与愁大神学过编程,于是就用1分钟的时间求出了Fn的结果。月落乌啼为此大吃一惊。你能学学爱与愁大神求出Fn的值吗?

输入格式
只有1行:n

输出格式
只有1行:Fn,保留两位小数。

输入输出样例
输入 #1 复制
6
输出 #1 复制
8.00
说明/提示
所有数据:n<=48

如果不知道怎么做,可以先计算出前几项,然后找规律。

#include<stdio.h>
#include<math.h> 
int main()
{
	int n;
	double x,a,b,c,d;
	scanf("%d",&n); 
	a=pow(((1+sqrt(5))/2),n); 
	b=pow(((1-sqrt(5))/2),n); 
	c=(a-b)/(sqrt(5)); 
	printf("%.2lf",c); 
	
	  return 0; 
} 

第一次用float定义发下如果n 的数字大一点的话会不精确,可能是后面的精度不够,然后就换成了个差不多的 double就可以了

发布了8 篇原创文章 · 获赞 1 · 访问量 664

猜你喜欢

转载自blog.csdn.net/WOF_Spark/article/details/103529656