Codeforces Round #443(div 2)

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值