你作为一名出道的歌手终于要出自己的第一份专辑了,你计划收录 n 首歌而且每首歌的长度都是 s 秒,每首歌必须完整地收录于一张 CD 当中。每张 CD 的容量长度都是 L 秒,而且你至少得保证同一张 CD 内相邻两首歌中间至少要隔 1 秒。为了辟邪,你决定任意一张 CD 内的歌数不能被 13 这个数字整除,那么请问你出这张专辑至少需要多少张 CD ?
你作为一名出道的歌手终于要出自己的第一份专辑了,你计划收录 n 首歌而且每首歌的长度都是 s 秒,每首歌必须完整地收录于一张 CD 当中。每张 CD 的容量长度都是 L 秒,而且你至少得保证同一张 CD 内相邻两首歌中间至少要隔 1 秒。为了辟邪,你决定任意一张 CD 内的歌数不能被 13 这个数字整除,那么请问你出这张专辑至少需要多少张 CD ?
每组测试用例仅包含一组数据,每组数据第一行为三个正整数 n, s, L。 保证 n ≤ 100 , s ≤ L ≤ 10000
输出一个整数代表你至少需要的 CD 数量。
7 2 6
4
var lines = readline()lines = lines[0].split(' ')//获得数据var n = parseInt(lines[0])var s = parseInt(lines[1])var l = parseInt(lines[2])//1.判断一张光盘能放几首歌,因为间隔为1s,所以给每首歌***var sLength = s + 1//向下取整var num = Math.floor(l / sLength)//最后一首歌不用间隔,需要判断if((l+1)%sLength === 0){num++}// 不能出现13// (1).刚好为13if(num == 13){num--}//2.计算总共放几张光盘var CDNum = Math.floor(n/num)if(n%num != 0){CDNum++}// (2).大于13,那么就只有可能发生在最后一张光盘身上if(num > 13){if(n % num == 13){CDNum++}}console.log(CDNum)
import java.util.*;
public class Main {
public static void main(String[] args) {
// 题目的输入时单行三大int数
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int s = sc.nextInt();
int L = sc.nextInt();
System.out.println(countCD(n, s, L));
}
public static int countCD(int n, int s, int L) {
int res = 0;
// count表示每张CD的最多存歌数
int count = (int) (L+1) / (s+1);
count = Math.min(count, n);
// 如果CD存的歌被13整除了,那就少放一首
if (count % 13 == 0) {
count--;
}
// n首歌,每个CD有count首曲子,则共有res个CD
res = n / count;
// 余数是多出来没放下的歌
int yu = n % count;
if (yu != 0) {
// 有余数证明有歌没放下,就加一个CD呗
res++;
// 不管怎么找都要避免因为有余数所有单独给的一个CD,
// 保证这个CD不能放13的倍数首歌曲
// 且此时每个CD放的曲子数count和剩下的yu首曲子只差1首
// 如果不是只差一首,而是还有更多的空余,
// 那就完全可以从其他的一张CD拿过来一首,让它不是13的倍数即可
if (yu % 13 == 0 && (count - yu) == 1) {
res++;
}
}
return res;
}
}
const [n, s, L] = readline().split(' ').map(item => parseInt(item, 10));
// s > L
if (s > L || n === 0) {
print(0);
}
// 一张cd只能容纳一首歌
if (L >= s && L < 2*s + 1) {
print(n);
}
if (L >= 2* s + 1) {
// 每张CD容纳的歌数
let per = Math.floor((L+1)/(s+1));
if (per % 13 === 0) {
per = per - 1;
}
// 结果
let result = Math.ceil(n / per);
// 特例:一张CD可以容纳所有的歌时,歌数能被13整除
if (n <= per && n % 13 === 0) result = 2;
print(result);
} while (line = readline()) {
var arr = line.split(' ')
var n = parseInt(arr[0]), s = parseInt(arr[1]), ll = parseInt(arr[2])
var cd = 1, count = 0, l = ll, r = Math.floor((ll - s) / (s + 1) + 1)
while (n > 0) {
if (l >= s) {
if (((count + 1) % 13 !== 0)) {
if (count === 0) {
l -= s;
} else {
l -= (s + 1);
}
count++
n--
} else if ((l > (2 * s + 2)) && (n >= 2) || ((n < r) && (l > s + 1)) && (cd !== 1)) {
l -= (2 * (s + 1));
count = count + 2
n -= 2
} else {
cd = cd + 1
count = 0
l = ll
}
} else {
cd = cd + 1
count = 0
l = ll
}
}
console.log(cd)
} import java.util.Scanner;
public class JRTT2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int n = scanner.nextInt();
int s = scanner.nextInt();
int L = scanner.nextInt();
System.out.println(getNum(n, s, L));
}
}
public static int getNum(int n, int s, int L) {
int maxPerCD = (L + 1) / (s + 1); // 每张CD最大的存歌量
int num = 0;
if (maxPerCD > n) { // 每张CD最大的存歌量大于歌数
if (n % 13 == 0) {
return 2;
} else {
return 1;
}
}
if (maxPerCD % 13 == 0) { // CD最大的存歌量能被13整除就自减1
maxPerCD--;
}
while (n / maxPerCD != 0) {
n -= maxPerCD;
num++;
}
if (n != 0) { // 此时的n表示剩余歌的数量
if (n % 13 == 0) {
if (maxPerCD - n == 1) {//剩余歌的数量被13整除,且与最大存歌量只相差1个的时候,此时不能通过交换来节省。只有再加一个CD
num += 2;
} else { //通过交换来节省所需CD的数量
num++;
}
} else {
num++;
}
}
return num;
}
}
#include<iostream>
using namespace std;
int main(){
int n, s, l;
while (cin >> n >> s >> l){
int max_num_pre_CD = 0;
for (; max_num_pre_CD*s + max_num_pre_CD - 1 <= l; ++max_num_pre_CD);//求得CD最大容纳歌曲数量
--max_num_pre_CD;
if (max_num_pre_CD % 13 == 0)
--max_num_pre_CD;
int numOfCD = n / max_num_pre_CD;
int left = n%max_num_pre_CD;
if (left != 0){//如果left没有剩下,也就直接输出numOfCD即可,left不为零就需要考虑left%13是否为0了
++numOfCD;//先算上left的歌要占的不足一张的CD数。
if(left%13 == 0){ //有两种情况left必须要另拆成两张CD存
if(numOfCD == 1)//加上left就一张,没有前一张满的可以用来得补,left得拆成两张CD
++numOfCD;
if(numOfCD>1 && (max_num_pre_CD-1)%13 == 0)//有前一张满的,但是不能补,left也得拆成两张CD
++numOfCD;
}
}
cout << numOfCD << endl;
}
return 0;
}
#include<iostream>using namespace std;intCDNUM(intn, ints, intl) {intrst = 0;intx = (l + 1) / (s + 1);if(n <= x) {if(n % 13== 0) return2;elsereturn1;}intpre, suff,remain;if(x % 13== 0) {pre = n / (x - 1);remain = n%(x-1);}else{pre = n / x;remain = n%x;}if(remain>0) {if(remain % 13== 0) {if(x - remain == 1) // 这里是问题的关键,因为当余数为13所整除时,看是否可以并接之前完整的CD,仅在CD的容量和余数差距为1时候,需要再加一个CDsuff = 2;elsesuff = 1;}elsesuff = 1;}elsesuff = 0;return pre + suff;}intmain() {intn, s, l;cin >> n >> s >> l;cout<<CDNUM(n, s, l)<<endl;return0;}
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n,s,l;
while(cin>>n>>s>>l)
{
int temp = 0;
temp = l/s;
while(temp>0)
{
if(temp*s+(temp-1)>l)
temp--;
else
break;
}
temp = temp<n?temp:n;
while(temp%13==0)
temp--;
double res= (double)n/temp;
int ress = ceil(res);
int downres = floor(res);
if(ress>1&&(ress*temp-n>2))//此时属于可以在最后两张CD互相调整一下数量
;
else if((n-downres*temp)!=0&&(n-downres*temp)%13==0)
ress++;
cout<<ress<<endl;
}
}
import sys
for line in sys.stdin:
data = line.split()
n = int(data[0])
s = int(data[1])
L = int(data[2])
num_in_one = L//(s+1)
if num_in_one == 0:
num_in_one =1
if num_in_one > n:
if n%13==0:
print 2
continue
else:
print 1
continue
else :
if num_in_one%13==0:
num_in_one = num_in_one-1
cd_need = n//num_in_one
if n%num_in_one !=0:
cd_need = cd_need + 1
print cd_need
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n, s, l;
while (cin >> n >> s >> l)
{
int sum = l / (s + 1);
if (l - sum * (s + 1) == s)
sum++;
if (sum % 13 == 0)
sum--;
int res = n / sum;
int x = n - res * sum;
if (n % sum != 0)
{
if (x % 13 == 0)
{
if ((sum - 1) % 13 == 0 || res == 0)
res += 2;
else res += 1;
}
else
res += 1;
}
cout << res << endl;
}
return 0;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextInt()) {
int res = 0;
int n = in.nextInt();
int s = in.nextInt();
int l = in.nextInt();
int c;
c = (l+1)/(s+1);
if((c%13) == 0) c--;
if(n%c == 0){
res =n/c;
}
else{
res = n/c + 1;
}
if((n%13 == 0) && n <= c) res++;
if(n%c == c -1 && n%c!=0 && n%c%13==0) res++;
System.out.println(res);
}
}
}
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
while(in.hasNext()){
int n = in.nextInt();
int s = in.nextInt();
int l = in.nextInt();
int count = (l+1)/(s+1);
count = Math.min(n, count);
if(count%13==0){
count--;
}
int sum = n/count;
int yu = n%count;
if(yu!=0){
sum++;
if(yu%13==0&&(count-yu)==1){//查看最后最后一张专辑的情况
sum++;
}
}
System.out.println(sum);
}
}
}
#include <iostream>
using namespace std;
int main() {
long long n, s, l;//n首歌,每首s秒,CD容量l秒
long long i, z;//每张CD存i首歌,需要z张
while(scanf("%lld%lld%lld", &n, &s, &l) != EOF) {
for(i=1; i*s+i-1<=l; i++);//计算1张CD可以存i首歌
i--;
z=1;
if(i % 13 == 0) {//每张CD不能存13的倍数首歌
i--;
}
for(z=1; i*z<n; z++);//计算需要多少张CD
if((n % 13 == 0) && (n <= i)) {//针对n是13的倍数且1张CD就可以存所有歌曲的情况
z++;
}
if((i - 1) % 13 == 0){//针对最后i-1可能是13的倍数
z++;
}
if((n == 1) && (s == 1) && (l == 1)){//单独考虑1,1,1
z=1;
}
cout << z << endl;
}
return 0;
}
process.stdin.resume();
process.stdin.setEncoding('ascii');
var input = "";
var input_array = "";
var n;
var s;
var l;
process.stdin.on('data', function (data) {
input += data;
});
function do_something(n, s, l){
//你的代码
var single = Math.floor(l / (s + 1));
if (single % 13 === 0) single--;
if (s === l) single = 1;
var res = Math.ceil(n / single)
if (res === 1 && n % 13 === 0) res++;
console.log(res)
}
process.stdin.on('end', function () {
input_array = input.split("\n");
var nLine = 0;
while(nLine < input_array.length){
var line = input_array[nLine++].trim();
if(line === ''){
continue;
}
var input_arrays = line.split(' ');
n = +input_arrays[0];
s = +input_arrays[1];
l = +input_arrays[2];
do_something(n, s, l);
}
});
dp[i]表示有i首歌时需要的专辑数。
最后是初始化:
其中,数组p存放每张专辑可以存放的歌曲数量,满足条件:不是13的倍数,不大于n,时长不大于L
dp[p[t]]为1,其它为101
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, s, L;
int dp[101] = { 0 };
vector<int>p(0);
cin >> n >> s >> L;
for (int i = 1; i*(s + 1) - 1 <= L; ++i) {
if (i > n)break;
if (i % 13) {
p.push_back(i);
dp[i] = 1;
}
}
for (int i = 1; i <= n; ++i) {
if (dp[i] == 1)continue;
dp[i] = 101;
for (int t = 0; t < p.size(); ++t) {
if (p[t] > i)break;
if (dp[i - p[t]] + 1 < dp[i])
dp[i] = dp[i - p[t]] + 1;
}
}
cout << dp[n];
return 0;
} 题目:你作为一名出道的歌手终于要出自己的第一份专辑了,你计划收录 n 首歌而且每首歌的长度都是 s 秒,每首歌必须完整地收录于一张 CD 当中。每张 CD 的容量长度都是 L 秒,而且你至少得保证同一张 CD 内相邻两首歌中间至少要隔 1 秒。为了辟邪,你决定任意一张 CD 内的歌数不能被 13 这个数字整除,那么请问你出这张专辑至少需要多少张 CD ?
<code lang="js">
while(input = readline()){
var lines = input.split(" ");
var n = parseInt(lines[0]);
var s = parseInt(lines[1]);
var L = parseInt(lines[2]);
var x; //设每张CD收录x首歌
x=(L+1)/(s+1);
x = Math.floor(x); //求出x
var ans = Math.ceil(n/x); //求出非特殊条件下的结果
if( x%13 == 0 ){
x = x-1; //如果x是13倍数,那么每张CD都要少收录1首
ans = Math.ceil(n/x);
}
if( n < x && n%13 == 0 ){
ans = 2;//如果仅需要一张CD但是收录了13倍数的歌曲需要加一张
}
if( (n-(ans-1)*x)%13 == 0 && x-(n-(ans-1)*x) == 1 ){
//如果最后一张CD是13的倍数【(n-(ans-1)*x)%13 == 0】,可以把前一张拿过来一首,但是拿过来后前一张又可能会是13的倍数
//这时候也需要再加一张CD,比如这样的情况“14 14 13” “27 27 27 26”
//这样情况的条件是最后一个必须比前一个少1【x-(n-(ans-1)*x) == 1】
//所以满足上述两项条件的时候总CD需要加1
ans += 1;
}
print(ans);
}
</code>