标签:codeforces
A:
题目地址:Music
题意:你要听一首时长为T秒的歌曲, 你点击播放时会立刻下载好S秒, 当你听到没有加载到的地方时, 就会重头听, 直到可以听完整首歌,由于网络堵塞, 你在q秒内只有q-1秒用于下载, 问需要重新多少次(第一次也算)
思路:这个题很类似于初中学过的追及问题。由于每q秒下载的时间为q-1,所以下载的速度可以确定为(q-1)/q。假设需要T秒才能下完,则有公式T*(q-1)/q+S=T,所以化简的T=q*S,所以下载的次数就是乘以s*q小于T的次数。
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
typedef __int64 LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-7;
int main()
{
int t,s,q;
while(~scanf("%d %d %d",&t,&s,&q)){
int cnt=0;
while(s<t){
cnt++;
s*=q;
}
printf("%d\n",cnt);
}
return 0;
}
B:
题目地址:Inventory
题意:给一个数n, 再给n个数a[i],a[i]中会有重复 或者大于n的数,要求你改变尽量少的数,给出一个1~n的排列。
思路:由题意可以看出来,把给出的<=n哈希标记一下 ,没有的数字加上去,大于n的数字去掉。
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
typedef __int64 LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-7;
const int maxn=1e5+10;
int a[maxn];
int has[maxn];
int main()
{
int n;
while(~scanf("%d",&n)){
memset(has,0,sizeof(has));
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(a[i]<=n&&!has[a[i]])
has[a[i]]=1;
else
a[i]=-1;
}
int cnt=1;
for(int i=1;i<=n;i++){
if(a[i]==-1){
while(has[cnt]) cnt++;
a[i]=cnt;
cnt++;
}
}
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\n",a[n]);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
Codeforces Round #315 (Div. 2)(A,B)
标签:codeforces
原文地址:http://blog.csdn.net/u013486414/article/details/47426259