A-Borya's Diagnosis
题意:
一个人去医院看医生,他需要按照1-n的顺序来看医生,这n名医生的工作时间安排类似于一个等差数列,从第s天开始,每隔d天再工作,求出他看完所有医生的时间。
解题思路:
用n个结构体来表示每一位医生的工作s和d,从头开始遍历,用一个变量来记录天数(res),初始为第一个医生的s,如果第i个医生的s小于res的话,就更新res为s,否则让s = s+d,一直到s小于res,最后输出res即可。
#include<bits/stdc++.h>
using namespace std;
typedef struct
{
int s;
int d;
} Doctor;
Doctor doc[1001];
int main()
{
int n;
cin>>n;
for(int i = 0; i<n; i++)
{
cin>>doc[i].s>>doc[i].d;
}
int res = doc[0].s;
for(int i = 1; i<n; i++)
{
while(doc[i].s<=res)
{
doc[i].s+=doc[i].d;
}
res = doc[i].s;
}
cout<<res<<endl;
}B- Table Tennis
题目大意:
有1-n组成的一个排列,每个数代表一个人的power,两个人比赛时power大的人会获胜,比赛从左到右比,输了的人移到末尾,赢的人和下一个人比,当有一个人赢了k盘时输出该人的power
思路:
最开始的时候理解错题了,我理解成,如果当前玩家没有达到k次,则该玩家被调到最后。但是由于中间的偶然想法:没有达到k次责不需要从当前玩家的第二个继续进行比较,而是通过把当前玩家输给的那个人更新成为新的当前玩家,弥补了这个错误。
#include<bits/stdc++.h>
using namespace std;
int people[501];
int main()
{
long long n,k;
cin>>n>>k;
for(int i = 0;i<n;i++)
cin>>people[i];
int res = people[0];
int cnt = 0;
for(long long i = 1;i<n;i++)
{
if(cnt>=k){
cout<<res<<endl;
return 0;
}
if(res>people[i])
cnt++;
else
{
cnt = 1;
res = people[i];//没有必要遍历,如果找到小的那么直接把初始位置移动到这个地方
}
}
cout<<*max_element(people,people+n)<<endl;
}
京公网安备 11010502036488号