每周学习总结:第三周。
一: 高精度除法+贪心:
vjudge的贪心作业Z题:https://vjudge.net/contest/426531#problem/Z
这里就要用到大数除法(高精度除低精度):
用减法模拟除法,对被除数的每一位(包含前面的余数)都减去除数,一直减到这一位小于零为止。
#include<cstdio>
#include<string>
char str[1100],ans[1100];
int num[3300];
int chu(int i) //大数除法;
{
int j,m=0,k=0;
char *q;
for(j = 0;str[j]!='\0'; j ++)
{
m = m*10+str[j]-'0';
ans[k++] = m/i +'0';
m%=i;
}
ans[k] = '\0';
q = ans;
while(*q=='0')
q++;
if(m!=0)
return 0;
for(j = 0; *q!='\0';j++,q++)
str[j] = *q;
str[j] = '\0';
return 1;
}
int main()
{
int i,j;
while(scanf("%s",str),str[0]!='-')
{
j=0;
if(str[1]=='\0')
{
printf("1%s\n",str);
continue;
}
for(i = 9; i > 1; i --)//从9开始除,实现数最小;
while(chu(i))
{
num[j++] = i;
}
if(strlen(str)>1)
{
printf("There is no such number.\n");
continue;
}
while(j>0)
printf("%d",num[--j]);
printf("\n");
}
}
本题总结:贪心较好想,高精度不会写,导致会思路写不了代码,惭愧惭愧!
二:
贪心+细节;
vjudge上的M题!!
纯粹的锻炼数学思维:好题哈!细节很多。
1,先考虑大的,对于44,55,66 的方块,必定每个占用一个箱子,对于33的,每四个正好占用一个箱子
2,考虑放22的方块,统计出之前用过的箱子有多少位置能放22的方块,注意方块数量可能不够
3,考虑放11的方块,也就是箱子中剩下的所有空间了!放入11的方块(注意点同上一步)
4,剩余的11 和22 的直接统计面积,看额外至少需要多少个箱子
参考这儿。
代码如下:
#include <cstdio>
int main()
{
int N, a, b, c, d, e, f, y, x;
while(1)
{
scanf("%d %d %d %d %d %d",&a, &b, &c, &d, &e, &f);
if(a==0 && b==0 && c==0 && d==0 && e==0 && f==0)
break;
N = f+e+d+(c+3)/4;
y = d*5;
if( c%4 == 3)
y += 1;
else if( c%4 == 2)
y += 3;
else if( c%4 == 1)
y += 5;
if( y < b)
N += ((b-y)+8)/9;
x = 36*N - 36*f - 25*e - 16*d - 9*c - 4*b;
if( x <a)
N += ((a-x)+35)/36;
printf("%d\n", N);
}
return 0;
}
本题总结:枚举法挺考验数学逻辑的,把握主要逻辑,走一步看一步,就不容易错。
而且(c+3)/4,((b-y)+8)/9等巧妙的利用数学思维代替了上限函数。
三:
比赛题目A题
看到这个题我的第一反应是用一个二维数组,发现数组范围太小。然后想想两个一维数组,还是不行。有没多想去找了 vector容器去定义二维数组,也老是wa。这是不是叫(吊死在一棵树上。)。
最后想到用数学逻辑,仅用了短短几行代码就ac了。再看看我那几十行长篇大论,惭愧惭愧!!
#include<iostream>
using namespace std;
unsigned long long n, m, x, cx, rx, ans;
int main()
{
ios::sync_with_stdio(false);
int t; cin >> t;
while (t)
{
cin >> n >> m >> x;
if (x % n == 0)
{
rx = x / (x / n);
cx = x / n;
}
else
{
rx = x % n;
cx = x / n + 1;
}
ans =(rx - 1) * m + cx;
cout << ans << endl;
t--;
}
}
总结:以后做题,要考虑全面,碰壁了再想一想这个方案是否真的适合,有没有更好的办法。反复揣摩题目传达的算法及思想,深入剖析一下算法逻辑,加强重复,进一步理解题目,真正做到做一题会一题。
下一周目标:
1、作业是真的a不动了,争取再a一道题吧。