2016-2017 ACM-ICPC CHINA-Final

 

A Gym 101194A Number Theory Problem

的二进制是1112k-1 的二进制是 k 1。所以 能被 3 整除时 2k-1 才能被 7 整除。

#include <bits/stdc++.h>
using namespace std;

int main() {
    int T;
    scanf("%d", &T);
    for(int ca = 1; ca <= T; ++ca) {
        int n;
        scanf("%d", &n);
        printf("Case #%d: %d\n", ca, n/3);
    }
    return 0;
}

  

 

 

B Gym 101194B Hemi Palindrome

 

 

 

C Gym 101194C Mr. Panda and Strips

 

 

 

D Gym 101194D Ice Cream Tower

 二分答案 mid,check的时候选 k 次,每次选 mid 个,贪心先选小的即可。

#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long LL;
const int maxn = 3e5 + 100;
int T;
int n, k;

LL a[maxn];
int vis[maxn];

bool check(int mid)
{
    queue<int> q;
    for (int i = 1; i <= mid; i++) q.push(i);
    int flag = 0, maxx = mid;

    for (int i = 1; i <= k-1; i++)
    {
        int times = 0;
        while(!q.empty() && times < mid)
        {
            int j = q.front(); q.pop();
            times++;
            int pos = lower_bound(a+maxx+1,a+1+n,2*a[j])-a;
            if (pos > n) { flag = 1; break; }
            q.push(pos);
            maxx = max(maxx, pos);
        }
        if (flag) return false;
    }
    return true;
}

int main()
{
    scanf("%d",&T);
    for(int t=1;t<=T;t++)
    {
        scanf("%d%d", &n, &k);
        for (int i = 1; i <= n; i++) scanf("%lld", &a[i]);
        sort(a+1, a+1+n);

        int l = 0, r = n/k, ans = 0;
        while(l <= r)
        {
            int mid = (l+r)/2;
            if (check(mid))
                ans = mid, l = mid+1;
            else r = mid-1;
        }

        printf("Case #%d: %d\n", t, ans);
    }
return 0;
}

  

  

 

E Gym 101194E Bet

设总共的钱数为 1,通过赔率可以求出买每个球队的花费。然后直接贪心就好了。double 精度,用long double

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;
const int maxn=100 + 10;
const int Max = 100000;
long double spend[maxn];

int main()
{ int t; scanf("%d", &t); for (int ca = 1; ca <= t; ca++) { int n; scanf("%d", &n); for (int i = 1; i <= n; i++) { long double x, y; char s; cin >> x >> s >> y; spend[i] = x/(y+x); } int ans = 0; long double tot = 1; sort(spend+1, spend+1+n); for (int i = 1; i <= n; i++) if (tot > spend[i]) tot -= spend[i], ans++; printf("Case #%d: %d\n", ca, ans); } return 0; }

  

 


F Gym 101194F Mr. Panda and Fantastic Beasts

 

 

 

G Gym 101194G Pandaria

 

 


H Gym 101194H Great Cells

 

 


I Gym 101194I Cherry Pick

 

 


J Gym 101194J Mr.Panda and TubeMaster

费用流。

 


K Gym 101194K Justice Rains From Above

 

 


L Gym 101194L World Cup

直接搜索一下每两个队对决的三种情况即可。如果答案没出现过,就是 Wrong Scoreboard,如果答案出现过多次,就是 No 。否则就是 Yes

#include <cstdio>
using namespace std;
int T;
int a[10];
int sc[10];

int fr[] = {0, 1, 1, 1, 2, 2, 3};
int to[] = {0, 2, 3, 4, 3, 4, 4};

int ans = 0;

void DFS(int k)
{
    if (k > 6)
    {
        int flag = 1;
        for (int i = 1; i <= 4; i++)
            if (sc[i] != a[i]) { flag = 0; break; }
        if (flag) ans++;
        return;
    }
    int x = fr[k], y = to[k];
    sc[x]+=3, DFS(k+1), sc[x] -= 3;
    sc[y]+=3, DFS(k+1), sc[y] -= 3;
    ++sc[x], ++sc[y], DFS(k+1), --sc[x], --sc[y];
}

int main(){
    scanf("%d",&T);
    for(int t=1;t<=T;t++){
        ans = 0;
        scanf("%d%d%d%d",&a[1],&a[2],&a[3],&a[4]);

        DFS(1);
        printf("Case #%d: ", t);

        if (ans == 0)
            printf("Wrong Scoreboard\n");
        else if (ans == 1) printf("Yes\n");
        else printf("No\n");
    }
return 0;
}

  

 

转载于:https://www.cnblogs.com/ruthank/p/9747358.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值