A Gym 101194A Number Theory Problem
7 的二进制是111,2k-1 的二进制是 k 个 1。所以 k 能被 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;
}