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!
监督自己不能再拖延了!