对于第一题,很是简单,就不多说了,记住字符\是'\''这样打出来的就行了
第二题就有些门道,反正我是没写出来
7-2 分香肠
有 N 根完全相同的香肠, 现在要平均分给 M 个客人。 问最少需要切几刀才能将其平均分给客人(不能多个香肠一起切)。
输入格式:
两个整数 N(1≤N≤10^5) 和 M(1≤M≤10^5)
输出格式:
一个整数,表示要切的刀数
输入样例:
在这里给出一组输入。例如:
2 6
输出样例:
在这里给出相应的输出。例如:
4
这题我是在草稿纸上写了一遍又一遍,想过看成一个整体去切,但是失败了,然后这题就失败了
我还想过二分答案去写,应该是能写出来,但是我失败了,被提示骗去上面的思路了。
题解是这样的
可以看出,以下切割策略是最佳的。
我们将香肠排列成一条直线,一条接着一条(从而获得由N个较短线段组成的线段)。将这条线切割成M个相等的线段可以得到所需的解。虽然我们在概念上做的是M-1切,但其中一些不是真正的切,而是落在香肠之间(较短的线段)。
例如,对于两条香肠和四个品尝者,第一次切是真实的,将第一条香肠分成两半,第二次切不是真实的,因为它实际上在两条香肠之间,第三次切是真的,将第二条香肠分成一半。
因此,我们可以简单地使用for循环来检查,对于对于每一次切割,它是真切割还是原本中间就是分开的。
另外,有一个明确的公式:解=M-gcd(N,M) (gcd即最大公约数)
明确的公式就不做细说;对于看成一个整体,我看了别的题解,他们是用的上面题解
是这样的,先看成一根,切m-1刀,对与每一刀进行判断是不是必须切的刀,比如两根分四个人,一根分给四个人得切三刀,每份四分之一,但对于第二刀,是多余的,所以是总共切两刀就行;
难就难在怎么判断,所以看了别人的,他们用了一个floor函数,floor函数向下取整,也就是四舍五入,abs(floor(now+0.5)-now)<=1e-7 ,now每次都加上这个n/m;如果now是比如说两根香肠,二分之一处就是多余刀,当now等于这个多余刀时,就把砍的次数减1;
h0145. 会议安排
学校的礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。小刘的工作就是安排学校礼堂的活动,每个时间最多安排一个活动。现在小刘有一些活动计划的时间表,他想尽可能的安排更多的活动,请问他该如何安排。
输入格式:
第一行是一个整型数m(m<100)表示共有m组测试数据。
每组测试数据的第一行是一个整数n(1<n<10000)表示该测试数据共有n个活动。
随后的n行,每行有两个正整数Bi,Ei(0<=Bi,Ei<10000),分别表示第i个活动的起始与结束时间(Bi<=Ei)
输出格式:
对于每一组输入,输出最多能够安排的活动数量。
每组的输出占一行
输入样例:
在这里给出一组输入。例如:
2
2
1 10
10 11
3
1 10
9 11
11 20
输出样例:
在这里给出相应的输出。例如:
2
2
这题很熟悉,写了,但是没过,我记得是学习通上有题,最少失约,是一道贪心题
唯一的差距就是这个是比原本的多一个求的次数
#include <bits/stdc++.h>
using namespace std;
struct node{
int st,ed;
}a[10005];
bool cmp(node a,node b){
return a.st<b.st;
}
int main(){
int n,m;
cin>>n;
while(n>0){
n--;
cin>>m;
for(int i=1;i<=m;i++){
cin>>a[i].st>>a[i].ed;
}
sort(a+1,a+1+m,cmp);
int tal=0,now=0;
for(int i=1;i<=m;i++){
if(a[i].st>=now){
now=a[i].ed;
tal++;
}
else{
if(a[i].ed<now) now=a[i].ed;
}
}
cout<<tal<<endl;
}
}
7-4 神秘密码
传说二战时X国收到了上帝的一串密码,只有解开密码,才能阻止战争的继续进行,世界才会恢复和平。解开密码的第一道工序就是解压缩密码,上帝对于连续的若干个相同的子串"X"会压缩为"[DX]"的形式(D是一个整数且1<=D<=99),比如说字符串"CBCBCBCB"就压缩为"[4CB]"或者"[2[2CB]]",类似于后面这种压缩之后再压缩的称为二重压缩。如果是"[2[2[2CB]]]"则是三重的。现在我们给你上帝发送的密码,请你对其进行解压缩。
输入格式:
一个字符串。
输出格式:
一个字符串。
输入样例:
在这里给出一组输入。例如:
AC[3FUN]
输出样例:
在这里给出相应的输出。例如:
ACFUNFUNFUN
【数据范围】
解压后的字符串长度在 20000 以内,最多只有十重压缩。保证只包含数字、大写字母、[
和 ]
。
所以我们只需要一个字符串,输入,然后对字符串进行判断判断[和数字再判断]
7-5 h0114.国王游戏
恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。
首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。
然后,让这 n 位大臣排成一排,国王站在队伍的最前面。
排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:
排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。
国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。
注意,国王的位置始终在队伍的最前面。
输入格式:
第一行包含一个整数 n(1≤n≤1000),表示大臣的人数。
第二行包含两个整数 a (0<a)和 b(b<10000),之间用一个空格隔开,分别表示国王左手和右手上的整数。
接下来 n 行,每行包含两个整数 a 和 b,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。
输出格式:
输出只有一行,包含一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。
输入样例:
在这里给出一组输入。例如:
3
1 1
2 3
7 4
4 6
输出样例:
在这里给出相应的输出。例如:
2
题解放这里了,代码如下
#include <bits/stdc++.h>
using namespace std;
struct jl{
int zs,ys;
}a[1005];
bool cmp(jl a,jl b){
return a.zs*a.ys<b.zs*b.ys;
}
int main(){
int n;
cin>>n;
cin>>a[0].zs>>a[0].ys;//输入国王的数据
for(int i=1;i<=n;i++){
cin>>a[i].zs>>a[i].ys;
}
sort(a+1,a+1+n,cmp);
int sum=1;
for(int i=1;i<=n-1;i++){
sum*=a[i].zs;
}
sum*=a[0].zs;
sum/=a[n].ys;
cout<<sum;
}
但是会发现ac不了,再仔细看看,高精度出问题了
解决完高精度的问题就能ac了