A. Music
题目大意:题目一共给了3个数---- T 表示歌曲的长度(s)、S 表示下载了歌曲的S后开始第一次播放(也就是说S秒的歌曲是事先下载好的)、q 表示下载速度(每秒下载歌曲(q-1)/q秒)。问题就是播放的速度比下载的速度快,每当播放到没下载的位置,就会重新从头播放,输出的就是从头播放的次数(包括第一次)。
解题思路:数学知识推公式,总时间一定
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <queue>
#include <string>
#include <map>
#include <stack>
#include <list>
#include <set>
using namespace std;
int main()
{
double t,s,q;
scanf("%lf%lf%lf",&t,&s,&q);
int cnt = 0;
while(s<t)
{
cnt++;
s = s*q;
}
printf("%d\n",cnt);
return 0;
}
B. Inventory
题目大意:给你n,然后n个数,n个数中可能重复,可能不是1到n中的数。然后你用最少的改变数,让这个序列包含1到n所有数,并输出最后的序列。
解题思路:贪心求解,遇到不符合的就用符合的替换
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <queue>
#include <string>
#include <map>
#include <stack>
#include <list>
#include <set>
using namespace std;
const int maxn = 1e5+100;
int a[maxn],flag[maxn],b[maxn];
int main()
{
int n;
scanf("%d",&n);
memset(flag,0,sizeof(flag));
for(int i = 1; i <= n; i++)
{
scanf("%d",&a[i]);
flag[a[i]]++;
}
int k = 0;
for(int i = 1; i <= n; i++)
{
if(!flag[i])
b[k++] = i;
}
k = 0;
for(int i = 1; i <= n; i++)
{
flag[a[i]] -= 1;
if(!flag[a[i]] && a[i] >= 1 && a[i] <= n)
printf("%d ",a[i]);
else
printf("%d ",b[k++]);
}
printf("\n");
return 0;
}
C. Primes or Palindromes?
题目大意:π(n)表示不大于n的素数个数,rub(n)表示不大于n的回文数个数,求最大n,满足π(n) ≤ A·rub(n)。A=p/q,题目给出p,q
解题思路:题目给出A的范围为1/42<=A<=42,将π(n)/rub(n)打表出来,满足条件的最大范围为1200000左右,所以再反过来暴力打表即可
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <queue>
#include <string>
#include <map>
#include <stack>
#include <list>
#include <set>
using namespace std;
const int maxn = 12e5;
bool prime[maxn];
void isPrime(int n)//筛法判断n以内的素数
{
prime[1] = false;
for(int i = 2; i <= n; i++)
{
if(!prime[i]) continue;
prime[i] = true;
for(int j = 2; j*i <= n; j++)
prime[i*j] = false;
}
}
bool isPalindromic(int n)//判断回文数
{
int res = 0;
int m = n;
while(n)
{
res *= 10;
res += n%10;
n /= 10;
}
return res == m;
}
int main()
{
memset(prime,true,sizeof(prime));
isPrime(maxn);
double p,q;
while(scanf("%lf%lf",&p,&q) != EOF)
{
double A = p/q;
int pr = 0;
int pa = 0;
int ans;
for(int i = 1; i <= maxn; i++)
{
pr += prime[i];
pa += isPalindromic(i);
if(pr <= A*pa)
ans = i;
}
printf("%d\n",ans);
}
return 0;
}