- 点击跳转专栏=>Unity3D特效百例
- 点击跳转专栏=>案例项目实战源码
- 点击跳转专栏=>游戏脚本-辅助自动化
- 点击跳转专栏=>Android控件全解手册
- 点击跳转专栏=>Scratch编程案例
- 点击跳转=>软考全系列
- 点击跳转=>蓝桥系列
👉关于作者
专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)
有什么需要欢迎底部卡片私我,获取更多支持,交流让学习不再孤单。
👉实践过程
需要所有整理的文档可底部卡片联系我,直接发压缩包。
😜图形排版
小明需要在一篇文档中加入 N 张图片,其中第 i 张图片的宽度是 Wi,高度是 Hi。
假设纸张的宽度是 M,小明使用的文档编辑工具会用以下方式对图片进行自动排版:
- 该工具会按照图片顺序,在宽度 M 以内,将尽可能多的图片排在一行。该行的高度是行内最高的图片的高度。
例如在 M=10 的纸张上依次打印 3x4, 2x2, 3x3 三张图片,则效果如下图所示,这一行高度为4。
(分割线以上为列标尺,分割线以下为排版区域;数字组成的矩形为第x张图片占用的版面)
0123456789
----------
111
111 333
11122333
11122333
- 如果当前行剩余宽度大于0,并且小于下一张图片,则下一张图片会按比例缩放到宽度为当前行剩余宽度(高度向上取整),
然后放入当前行。例如再放入一张4x9的图片,由于剩余宽度是2,这张图片会被压缩到2x5,再被放入第一行的末尾。
此时该行高度为5:
0123456789
----------
44
111 44
111 33344
1112233344
1112233344
- 如果当前行剩余宽度为0,该工具会从下一行开始继续对剩余的图片进行排版,直到所有图片都处理完毕。
此时所有行的总高度和就是这 N 张图片的排版高度。例如再放入11x1, 5x5, 3x4 的图片后,效果如下图所示,总高度为11:
0123456789
----------
44
111 44
111 33344
1112233344
1112233344
5555555555
66666
66666777
66666777
66666777
66666777
现在由于排版高度过高,图片的先后顺序也不能改变,小明只好从 N 张图片中选择一张删除掉以降低总高度。
他希望剩余N-1张图片按原顺序的排版高度最低,你能求出最低高度是多少么?
输入:
第一行包含两个整数 M 和 N,分别表示纸张宽度和图片的数量。
接下来 N 行,每行2个整数Wi, Hi,表示第 i 个图大小为 Wi*Hi。
对于30%的数据,满足1<=N<=1000
对于100%的数据,满足1<=N<=100000,1<=M, Wi, Hi<=100
输出:
一个整数,表示在删除掉某一张图片之后,排版高度最少能是多少。
样例输入:
4 3
2 2
2 3
2 2
样例输出:
2
另一个示例,
样例输入:
2 10
4 4
4 3
1 3
4 5
2 1
2 3
5 4
5 3
1 5
2 4
样例输出:
17
#include <cmath>
#include <iostream>
using namespace std;
#define MAXN 100005
int M, N;
int f[MAXN];
struct pic {
int w, h;
} pics[MAXN];
struct line {
int w, h;//已经使用的宽度,当前的高度
line() { w = 0, h = 0; }
line(int _w, int _h) {
w = _w, h = _h;
}
line operator+(pic _p) {
if (w + _p.w > M) {//对图片进行压缩
_p.h = ceil(1.0 * _p.h * (M - w) / _p.w);
_p.w = M - w;
}
return line(w + _p.w, max(h, _p.h));
}
bool full() {
return w == M;
}
void clr() { w = h = 0; }
};
//在已有的line的基础上,从第k张图开始插入,最终能得到的整体高度
int push_till_full(line a, int k) {
for (; k <= N && !a.full(); ++k) {//在行未满的情况下,添加图片
a = a + pics[k];
}
return a.h + f[k];
}
int main(int argc, const char *argv[]) {
scanf("%d%d", &M, &N);
for (int i = 1; i <= N; ++i) {
scanf("%d%d", &pics[i].w, &pics[i].h);
}
for (int i = N; i >= 1; --i) {
f[i] = push_till_full(line(0, 0), i);//f[i]的含义,i 号图片及其后的图片另起一行插入得到的高度
}
line a;//一开始没有宽度和高度,要填充的行
int ans = 1e7;
int per = 0;//记录之前完整行累计的高度
for (int i = 1; i <= N; ++i) {
//不要第i张pic
int new_h = per + push_till_full(a, i + 1);//历史上完整行的高度是per,从i+1张图插入得出的整体高度由函数计算出
ans = min(ans, new_h);//用第i+1张图填入a这个line
a = a + pics[i];//将第i张图放入,作为下次迭代的line
if (a.full()) {//行已经填满,要重置line,并且结算一个整行的高度
per += a.h;
a.clr();//开启一个新行,空行
}
}
cout<<ans<<endl;
return 0;
}
😜包子凑数
小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包子。
每种蒸笼都有非常多笼,可以认为是无限笼。
每当有顾客想买X个包子,卖包子的大叔就会迅速选出若干笼包子来,使得这若干笼中恰好一共有X个包子。
比如一共有3种蒸笼,分别能放3、4和5个包子。
当顾客想买11个包子时,大叔就会选2笼3个的再加1笼5个的(也可能选出1笼3个的再加2笼4个的)。
当然有时包子大叔无论如何也凑不出顾客想买的数量。比如一共有3种蒸笼,分别能放4、5和6个包子。
而顾客想买7个包子时,大叔就凑不出来了。
小明想知道一共有多少种数目是包子大叔凑不出来的。
输入
第一行包含一个整数N。(1 <= N <= 100)
以下N行每行包含一个整数Ai。(1 <= Ai <= 100)
输出
一个整数代表答案。如果凑不出的数目有无限多个,输出INF。
例如,
输入:
2
4
5
程序应该输出:
6
再例如,
输入:
2
4
6
程序应该输出:
INF
#include <stdio.h>
#include <iostream>
using namespace std;
int n, g;
int a[101];
bool f[10000];
int gcd(int a, int b) {
if (b == 0)return a;
return gcd(b, a % b);
}
int main(int argc, const char *argv[]) {
scanf("%d", &n);
f[0] = true;
for (int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
if (i == 1)g = a[i];//初始化最大公约数
else g = gcd(a[i], g);
for (int j = 0; j < 10000; ++j) {
if (f[j])f[j + a[i]] = true;
}
}
if (g != 1) {
printf("INF\n");
return 0;
}
//统计个数
int ans = 0;
for (int i = 0; i < 10000; ++i) {
if (!f[i]) {
ans++;
// cout << i << endl;
}
}
printf("%d\n", ans);
return 0;
}
😜位反序数
设N是一个四位数,它的9倍恰好是其反序数,求N。反序数就是将整数的数字倒过来形成的整数。例如:1234的反序数是4321。
问题分析与算法设计
可设整数N的千、百、十、个位为i、j、k、l,其取值均为0~9,则满足关系式:
(i103+j102+10k+l)9=(l103+k102+10j+i)
的i、j、k、l即构成N。
#include<stdio.h>
int main()
{
int i;
for(i=1002;i<1111;i++) /*穷举四位数可能的值*/
if(i%10*1000+i/10%10*100+i/100%10*10+i/1000==i*9)
/*判断反序数是否是原整数的9倍*/
printf("The number satisfied stats condition is: %d\n",i);
/*若是则输出*/
}
*运行结果
The number satisfied states condition is:1089
😜自守数
自守数是指一个数的平方的尾数等于该数自身的自然数。例如:
252=625 762=5776 93762=87909376
请求出200000以内的自守数
问题分析与算法设计
若采用“求出一个数的平方后再截取最后相应位数”的方法显然是不可取的,因为计算机无法表示过大的整数。
分析手工方式下整数平方(乘法)的计算过程,以376为例:
376 被乘数
X 376 乘数
———-
2256 第一个部分积=被乘数乘数的倒数第一位
2632 第二个部分积=被乘数乘数的倒数第二位
1128 第三个部分积=被乘数乘数的倒数第三位
———-
141376 积
本问题所关心的是积的最后三位。分析产生积的后三位的过程,可以看出,在每一次的部分积中,并不是它的每一位都会对积的后三位产生影响。总结规律可以得到:在三位数乘法中,对积的后三位产生影响的部分积分别为:
第一个部分积中:被乘数最后三位乘数的倒数第一位
第二个部分积中:被乘数最后二位乘数的倒数第二位
第三个部分积中:被乘数最后一位*乘数的倒数第三位
将以上的部分积的后三位求和后截取后三位就是三位数乘积的后三位。这样的规律可以推广到同样问题的不同位数乘积。
按照手工计算的过程可以设计算法编写程序。
#include<stdio.h>
int main()
{
long mul,number,k,ll,kk;
printf("It exists following automorphic nmbers small than 200000:\n");
for(number=0;number<200000;number++)
{
for(mul=number,k=1;(mul/=10)>0;k*=10);
/*由number的位数确定截取数字进行乘法时的系数k*/
kk=k*10; /*kk为截取部分积时的系数*/
mul=0; /*积的最后n位*/
ll=10; /*ll为截取乘数相应位时的系数*/
while(k>0)
{
mul=(mul+(number%(k*10))*(number%ll-number%(ll/10)))%kk;
/*(部分积+截取被乘数的后N位*截取乘数的第M位),%kk再截取部分积*/
k/=10; /*k为截取被乘数时的系数*/
ll*=10;
}
if(number==mul) /*判断若为自守数则输出*/
printf("%ld ",number);
}
}
*运行结果
It exsts following automorphic numbners smaller than 200000:
0 1 5 6 25 76 376 625 9376 90625 109376
👉其他
📢作者:小空和小芝中的小空
📢转载说明-务必注明来源:https://zhima.blog.csdn.net/
📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。
温馨提示:点击下方卡片获取更多意想不到的资源。