某天和小陈学长和小王学姐吃饭回来,小王学姐准备请小陈吃甘蔗,不过由于最近卫生大检查,所以不准随便乱吐,所以小陈学长只能把吃过的甘蔗先吐到手里拿着,等到有垃圾桶的时候在扔进去,不过手能拿的次数m(1<=m<=50)有限,所以路上会频繁的找垃圾桶,等回到机房小陈学长突然想知道他把吃过的甘蔗都扔到那些垃圾桶了,所以委托小王学姐想一想,当然小王学姐记忆力超群,记得总共有n(1<=n<=100)个垃圾桶,而且记得垃圾桶到卖甘蔗处的距离x(1<=x<=10000),并且编号为y(1<=y<=1000000,没有重复编号),都告诉了小陈,假设卖甘蔗的位置位0,机房的位置是终点,小陈学长每次都是手里放满之后才会去扔到垃圾桶(当然如果吃完了,手里还有的话不管有多少都会扔到垃圾桶的),并且不会回头,手里满后他不会再吃的,而且机房有规定不允许吃东西,所以到机房时候如果他没有吃完也得扔到机房门前的垃圾桶里面(机房门口一定会有一个垃圾桶),小陈学长知道自己吃一口甘蔗需要时间t(1s<=t<=10s)(吐甘蔗动作和扔甘蔗动作所需的时间可以忽略),并且知道自己步行的速度 v(1m/s<=v<=5m/s),还有这个甘蔗可以吃k(1<=k<=1000)次, 那么聪明的学弟妹们们,能够帮助小陈学长计算出都扔到哪几个垃圾桶了吗?
输入
首先输入一个T, 表示下面有T组数据
每组数据首先输入5个整数 n, m, t, v, k
下面n行每行两个整数x,y
输出
升序输出小陈学长所扔的垃圾桶的的编号,两个数之间有一个空格
1
7 3 1 2 10
3 7
15 2
7 9
8 15
20 6
18 5
6 10
2 6 10
题目分析:
属于复杂点的模拟题,而且里面的变量比较多,不过观察可以看发现用距离当轴比较容易模拟,
//////////////////////////////////////////////////////////////////////////
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define maxn 10005
#define INF 100000
int main()
{
int T;
freopen("1.in", "r", stdin);
freopen("1.out", "w", stdout);
scanf("%d", &T);
while(T--)
{
int i, n, m, t, v, k, x, y, end=0;
int now_m=0, now_k=0, pre=0;
int len[maxn]={0}, p[maxn], pn=0;
scanf("%d%d%d%d%d", &n, &m, &t, &v, &k);
for(i=0; i<n; i++)
{
scanf("%d%d", &x, &y);
len[x] = y;
if(end < x)
end = x;
}
for(i=1; i<=end; i++)
{
//先判断在这个位置可不可以吃
if( (i-pre) >= (t*v) && now_m < m)//可以吃,并且手里还有容量
{
now_m++;
now_k++;//只记录吐出来多少次
if(now_m < m)
{
pre = i;
}
}
//有垃圾桶并且手里满了
if(len[i] && now_m == m)
{
p[pn++] = len[i];
now_m=0;
if(now_k < k)
{
pre = i;
}
}
//有垃圾桶,手里没有满不过吃完了
else if(len[i] == 1 && now_m && now_k == k)
{
p[pn++] = len[i];
now_m = 0;
}
//到机房不过还没有吃完
else if(i == end && now_k < k)
{
p[pn++] = len[i];
now_k = k;
}
if(now_k == k)break;
}
sort(p, p+pn);
for(i=0; i<pn; i++)
printf("%d%c", p[i], i==pn-1?' ':' ');
}
return 0;
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define maxn 10005
#define INF 100000
int main()
{
int T;
freopen("1.in", "r", stdin);
freopen("1.out", "w", stdout);
scanf("%d", &T);
while(T--)
{
int i, n, m, t, v, k, x, y, end=0;
int now_m=0, now_k=0, pre=0;
int len[maxn]={0}, p[maxn], pn=0;
scanf("%d%d%d%d%d", &n, &m, &t, &v, &k);
for(i=0; i<n; i++)
{
scanf("%d%d", &x, &y);
len[x] = y;
if(end < x)
end = x;
}
for(i=1; i<=end; i++)
{
//先判断在这个位置可不可以吃
if( (i-pre) >= (t*v) && now_m < m)//可以吃,并且手里还有容量
{
now_m++;
now_k++;//只记录吐出来多少次
if(now_m < m)
{
pre = i;
}
}
//有垃圾桶并且手里满了
if(len[i] && now_m == m)
{
p[pn++] = len[i];
now_m=0;
if(now_k < k)
{
pre = i;
}
}
//有垃圾桶,手里没有满不过吃完了
else if(len[i] == 1 && now_m && now_k == k)
{
p[pn++] = len[i];
now_m = 0;
}
//到机房不过还没有吃完
else if(i == end && now_k < k)
{
p[pn++] = len[i];
now_k = k;
}
if(now_k == k)break;
}
sort(p, p+pn);
for(i=0; i<pn; i++)
printf("%d%c", p[i], i==pn-1?' ':' ');
}
return 0;
}