暑假程序集训的日常~Day2

Day2

题目

空箱问题

//大佬的方法

#include<stdio.h>
#include<stdlib.h>
 
int main(){
 int x,y,cnt;  //x为2×2的空位子数量,y为1×1的空位子数量
 int a1,a2,a3,a4,a5,a6; //6个包裹的大小
 int c[4]={0,5,3,1};  //当有3×3的时,则2×2的空位子数量可能的个数,这是3×3到2×2的空位子数量的映射
 while(1){
	 cnt=0;
  scanf("%d%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5,&a6);
  if(a1==0&&a2==0&&a3==0&&a4==0&&a5==0&&a6==0)
	  break;
  cnt+=a6+a5+a4+(a3+3)/4;  //a6和a5和a4以及(a3+3)/4都分别占用一个箱子,(a3+3)/4是对a3每满4向上取整的个数
  x=5*a4+c[a3%4];   //这是计算2×2空位子的总个数,每一个a4装的箱子都有着5个2×2的空位子+每一个a3装的箱子可能存在2×2的空位子数量
  if(a2>x)   //计算a2的数量是否大于其空位子的数量
	  cnt+=(a2-x+8)/9;  //计算a2填满空位子后剩余的a2所需要的箱子的个数。(a2-x+8)/9是对a2每满9向上取整的箱子个数
  y=36*cnt-36*a6-25*a5-16*a4-9*a3-4*a2;  //计算剩余1×1空位子的个数
  if(a1>y)//计算a1的数量是否大于其空位子的数量
	  cnt+=(a1-y+35)/36;//计算a1填满空位子后剩余的a1所需要的箱子的个数.(a1-y+35)/36是对a1每满36向上取整的箱子个数
 printf("%d\n",cnt);
 }
return 0;
}
 


————————————————
版权声明:本文为CSDN博主「无尽的沉默」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hgnuxc_1993/article/details/111243289
//菜吸吸的方法
//错误原因超时

#include<stdio.h>
int main(){
	int num=0,r;
	int a[100][6];
	for(int i=0;num!=6;i++){
		num=0;
		for(int j=0;j<6;j++){
			scanf("%d",&a[i][j]);
			if(a[i][j]==0){
				num++;
			}
		}
		if(num!=6){
			r++; 
		}
	}
	int box[100];
	for(int i=0;i<r-1;i++){
		int v=0;
		for(int j=0;j<6;j++){
			switch(j){
				case 0:v+=1*a[i][0];break;
				case 1:v+=4*a[i][1];break;
				case 2:v+=9*a[i][2];break;
				case 3:v+=16*a[i][3];break;
				case 4:v+=25*a[i][4];break;
				case 5:v+=36*a[i][5];break;
			}
		}
		if(v%36==0){
			box[i]=v/36;
		}
		else{
			box[i]=v/36+1;
		}
		printf("%d\n",box[i]);
	}
	return 0;
	
}

问题的解决有时候不能用太直接的方法,要去思考问题的最优解。

不过利用算法和数学对现在我来说实在有些薄弱,需要加强!!

简单密码

#include<stdio.h>
#include<string.h>
int main(){
	char s[201];
	while(gets(s)){   
		int i,len=strlen(s);
		for(i=0;i<len;i++){
			if(s[i]>='A'&&s[i]<='Z'){
				s[i]=(s[i]-'A'-5+26)%26+'A';   //核心算法,向左平移5个
			}
			printf("%c",s[i]);
		} 
		printf("\n"); 
		gets(s);     //接收END 
	} 
	return 0;
}
//时间为10ms 
#include<stdio.h>
#include<string.h>
int main(){
	char s[201];
	while(gets(s)){       //接收START 
		if(strcmp(s,"ENDOFINPUT")==0)
			break;
		gets(s);       //接收密文
		int i,len=strlen(s);
		for(i=0;i<len;i++){
			if(s[i]>='A'&&s[i]<='Z'){
				s[i]=(s[i]-'A'-5+26)%26+'A';   //核心算法,向左平移5个
			}
			printf("%c",s[i]);
		} 
		printf("\n"); 
		gets(s);     //接收END 
	} 
	return 0;

————————————————
版权声明:本文为CSDN博主「vivi_cin」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/vivi_cin/article/details/105752537
//时间为2ms 

上面的是把下面的进行修改,也可以过题目,但是时间有差别,还不太懂为什么。

课堂视频

C小技巧

//用加法交换两个变量的值

a=a+b;
b=a-b;
a=a-b;

异或^:对二进制,两个数,对应的位相同取0,不太相同取1

a^0==a

a^a==0

//用异或交换两个变量的值

a=a^b
b=a^b//即b=a^b^b,b=a^0=a
a=a^b//即a=a^b^a,因为异或符合交换律,所以a=b^a^a=b^0=b
//有2n+1个数,其中有2n个数两两相对,找出剩下了的一个数
answer=a^b^c^d^b^a=d^0=d

本日还有一些题目等待解决,会在周五总结出blog!
监督自己不能再拖延了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值