A题,他要去见n个医生,每个医生都有一个特殊的工作时间表,在si天开始工作,每个di天工作。他在最后一个医生那里拿到他的病情表。问最快能拿到病情表是那一天。
因为范围比较小,所以直接暴力就行。
代码如下:
#include<iostream>
#include<cstring>
#include<string>
#include<set>
#include<cmath>
#include<vector>
#include<algorithm>
#include<map>
#include<queue>
#include<string>
using namespace std;
const int MAX = 1010;
typedef long long ll;
ll s[MAX], d[MAX];
int n;
ll solve() {
ll now = s[1];
for (int i = 2; i <= n; ++i) {
for (ll k = 0;; ++k) {
if (s[i] + k*d[i] > now) {
now = s[i] + k*d[i];
break;
}
}
}
return now;
}
int main(void) {
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%lld %lld", &s[i], &d[i]);
}
printf("%lld\n", solve());
return 0;
}
B题,n个人打乒乓球,赢的人加1分,输的人从新放到队尾排队,问第一个到达k分的人的power是多少。每一个人都有的一个power值,对于一场比赛,power值大的人会获得胜利。
可以看出,如果power值最大的人上场后,还没有人获得k分,那么最先获得k分的人一定是这个power最大的人,所以直接模拟一遍就行。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<string>
#include<set>
#include<queue>
using namespace std;
typedef long long ll;
const int MAX = 510;
ll a[MAX],n,k,num[MAX];
ll solve() {
ll Max = 0;
for (int i = 1; i <= n; ++i) {
if (a[i] > Max) Max = a[i];
}
memset(num, 0, sizeof(num));
ll Win = 1, lose = 1;
for (int i = 2; i <= n; ++i) {
if (a[i] > a[Win]) {
lose = Win;
Win = i;
}
else {
lose = i;
}
num[Win]++;
if (num[Win] == k) return a[Win];
if (a[Win] == Max) break;
}
return Max;
}
int main(void) {
scanf("%lld %lld", &n, &k);
for (int i = 1; i <= n; ++i) {
scanf("%lld", &a[i]);
}
printf("%lld\n", solve());
return 0;
}
C题,经过n次运算后得到一个结果,问你能不能通过k(k<=5)得到同样的结果。并输出运算。
逐位来进行考虑,考虑每一位发生了什么运算,所以用一个x = 0,y = 1023,先进行运算,判断每一位全是0,和每一位全是1的数运算后会变为什么。如果是0->0,1->1,则可能是&1,^0,所以只需要对应答案位置加上这个数就行。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<set>
#include<vector>
#include<map>
#include<algorithm>
#include<queue>
using namespace std;
bool isok(int x,int i){
if(x&(1<<i)) return true;
return false;
}
int main(void){
int x = 0,y = 1023;
int n,v;
scanf("%d",&n);
char op[10];
for(int i=1;i<=n;++i){
scanf("%s%d",op,&v);
if(op[0] == '^') x^=v,y^=v;
else if(op[0] == '&') x&=v,y&=v;
else x |= v,y |= v;
}
int v1 = 0,v2 = 0,v3 = 0;
for(int i=0;i<=9;++i){
if(!isok(x,i) && isok(y,i)) v2 += (1<<i);
else if(isok(x,i) && isok(y,i)) v1 += (1<<i),v2 += (1 << i);
else if(isok(x,i) && !isok(y,i)) v2 += (1<<i),v3 += (1 << i);
}
printf("3\n");
printf("| %d\n",v1);
printf("& %d\n",v2);
printf("^ %d\n",v3);
return 0;
}