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; }