A. If at first you don’t succeed…
题目大意:
给出A、B、C、N。表示去BugDonalds的有A个人,去BeaverKing的有B个人,两者都去的有C人,一共有N人,问,有多少人没两者都没去。 答案非法 输出-1。
提示:以下是本篇文章正文内容,下面案例可供参考
B. Getting an A
题目大意: 至少重做几门作业能让平均分是5分,平均分的计算四舍五入。
C. Candies
题目大意:
一共有N块糖果,每次吃掉K块,有另外一个人每次偷吃剩下的10%(不够10块时 不偷吃),问K最小是几才能迟到一半的糖果。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
long long n;
inline bool judge(long long k) {
long long num = n,cnt = 0;
while(num > 0) {
if(num >= k) num -= k,cnt += k;
else { cnt += num; break; }
if(cnt >= (n + 1) / 2) return true;
if(num >= 10) num -= (long long)(num * 0.1);
}
if(cnt >= (n + 1) / 2) return true;
else return false;
}
int main(int argc,char* argv[]) {
cin >> n;
long long l = 1,r = n,ans,Mid;
while(l <= r) {
Mid = l + r >> 1;
if(judge(Mid)) ans = Mid,r = Mid - 1;
else l = Mid + 1;
}
cout << ans;
//system("pause");
return 0;
}
D. Bishwock
题目大意:
直接就是贪心大法好。。。
#include<iostream>
#include<cstring>
#include<cstdio>
#define Maxn 105
using namespace std;
char s1[Maxn],s2[Maxn];
int main(int argc,char* argv[]) {
scanf("%s",s1);
scanf("%s",s2);
int ans = 0,len = strlen(s1);
for(int i=0; i<len; i++) {
bool flag = 0;
if(s1[i] == '0' && s2[i] == '0') {
if(i > 0) { // 向左找 优先向左找
if(s1[i - 1] == '0') {
s1[i - 1] = 'x';
flag = 1;
}
else if(s2[i - 1] == '0') flag = 1,s2[i - 1] = 'x';
}
if(i < len - 1 && !flag){ // 向右找
if(s1[i + 1] == '0') flag = 1,s1[i + 1] = 'x';
else if(s2[i + 1] == '0') flag = 1,s2[i + 1] = 'x';
}
}
if(flag) s1[i] = s2[i] = 'x',ans++;
}
cout << ans;
//system("pause");
return 0;
}
E. Bus Number
假设一个数字在A中出现了cnt[i]次,那么其在B中出现的次数可能是1~cnt[i] 都有可能,直接DFS统计答案。注意每次更新答案的时候,应该减去0作为前导的情况。
每次情况的答案贡献是:
a n s = n ! n 1 ! ∗ n 2 ! ∗ . . . ∗ n k ! ans=\frac{n!}{n_1!*n_2!*...*n_k!} ans=n1!∗n2!∗...∗nk!n!
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define LL long long
int num[10],d[10];
LL fac[20],ans;
char s[20];
void DFS(int n,int m) {// m 是答案数字的位数 n表示当前考虑第几种字符的安排情况
if(n == 10) {
LL res = fac[m],t = 0;
for(int i=0; i<=9; i++)
res /= fac[d[i]];
if(d[0] > 0) {// 减掉 前导0的情况
t = fac[m - 1];
t /= fac[d[0] - 1];
for(int i=1; i<=9; i++)
t /= fac[d[i]];
}
ans += (res - t);
return ;
}
if(num[n] > 0) {
for(int i=1; i<=num[n]; i++) {
d[n] = i;
DFS(n + 1,m + i);
d[n] = 0;
}
} else {
d[n] = 0;
DFS(n + 1,m);
}
}
int main(int argc,char* argv[]) {
fac[0] = 1;
for(int i=1; i<=19; i++) fac[i] = fac[i - 1] * i;
ans = 0;
scanf("%s",s);
int len = strlen(s);
for(int i=0; i<len; i++) num[s[i] - '0']++;
DFS(0,0);
cout << ans << endl;
//system("pause");
return 0;
}