- 链接:https://www.nowcoder.com/acm/contest/190/E
来源:牛客网
题目描述
Applese有个神奇的能力,TA可以把m个硬币融合成1个硬币,是不是很厉害。现在Applese有n个硬币,TA想把这个n个硬币融合成1个,请问他能完成吗?
输入描述:
输入两个整数n,m(1 ≤ n, m ≤ 109)
输出描述:
如果Applese能完成,输出"Yes",否则输出"No"。
考虑Huffman编码时补全节点的情况:n≡1(mod m−1 )。所以只需要判断这个式子是否成立就行了。
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long n, m;
cin >> n >> m;
if (m == 1)
cout << ((n == 1) ? "Yes" : "No") << endl;
else if (m == 2)
cout << "Yes" << endl;
else
cout << ((n % (m - 1) == 1) ? "Yes" : "No") << endl;
return 0;
}
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
int main()
{
int n,m;
scanf("%d%d",&n,&m);
if(m==n)
{
printf("Yes\n");return 0;
}
if(m==1)//一定要考虑特殊情况,m为1,n不为1,均不可能!!
{
printf("No\n");return 0;
}
while(n>=m)//把问题想的简单些,n大于等于m时要进行融合
{
n=n%m+n/m;//更新n即可,m不变
}
if(n==1) printf("Yes\n");
else printf("No\n");
return 0;
}
链接:https://www.nowcoder.com/acm/contest/190/C
来源:牛客网
题目描述
有一天,MWH突然来了兴致,想和CSL比比谁枪法好。于是他们找来了一个瓶子,比比看谁先打中这个瓶子。 给定MWH的命中率和CSL的命中率。 两人轮流射击,MWH先手,问谁获胜的概率大?
输入描述:
输入两个整数和,表示MWH和CSL的命中率。.
输出描述:
若MWH获胜的概率大,则输出"MWH"。 若CSL获胜的概率大,则输出"CSL",否则输出"equal"。
#include <stdio.h>
int main()
{
int a, b;
int sub;
scanf("%d%d", &a, &b);
sub = a*100 - (100 - a)*b;//算出前两次的差,即可判断
if(sub == 0){
puts("equal");
}else{
if(sub > 0){
puts("MWH");
}else{
puts("CSL");
}
}
return 0;
}
- 链接:https://www.nowcoder.com/acm/contest/190/G
来源:牛客网
题目描述
CSL手上有n个苹果,第i个苹果的质量是wi,现在他想把这些苹果分给他的好朋友wavator和tokitsukaze。但是CSL为了不让他们打架,根据质量决定尽量地均分成两堆分给他们。现在CSL想知道到底给每个人分多少质量的苹果。
注意:苹果不能劈开来,并且如果不能正好均分,tokitsukaze小姐姐会拿到重的那一堆。输入描述:
第一行输入一个整数n(2 ≤ n ≤ 100),第二行n个整数,表示每个苹果的质量wi(1 ≤ wi ≤ 100)。
输出描述:
输出两个整数,分别表示wavator和tokitsukaze得到的苹果的质量。
令f[i]
表示是否能组成质量为i的,每次输入就转移一下就行了。
从总质量/2开始枚举(向上/向下都行),直到找到一个f[i]\neq0
输出解就行。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
int a[105];
int f[10005];
int main()
{
int n,sum=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]),sum+=a[i];
for(int i=0;i<n;i++)
{
for(int j=sum/2;j>=a[i];j--)
{
f[j]=max(f[j],f[j-a[i]]+a[i]);
}
}
printf("%d %d\n",f[sum/2],sum-f[sum/2]);
return 0;
}