第三周学习总结

每周学习总结:第三周。

一: 高精度除法+贪心:
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一道题吧。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值