第三周上机题解
题目解法不唯一,此处仅给出一种参考解法(A~E、H题难度较大,此处仅给出参考链接,有兴趣可自行百度学习)ps.正式比赛时建议先做简单题尽量得分而不是优先死磕难题。
A Cotree
树形DP,参考链接:
Cotree【树DP】
B Math
此题需要较好数学功底,参考链接:
Math
C Trap
容斥原理+组合计数,参考链接:
Trap
D Wave
此题考察线段树,但由于c范围较小,也可暴力模拟,且思路不涉及很难的算法知识,有兴趣可尝试,参考链接:
(暴力模拟)Wave
E Packing
难度较大,不做要求。
F String
求最大公约数,这里用的是辗转相除法
#include
//辗转相除求最大公约数
int gcd(int m,int n)
{
if(n==0)
return m;
return gcd(n,m%n);
}
int main()
{
char c[105];
int i,n,num1,num2,tmp;
int numc[4]={0};
scanf("%d",&n);
getchar(); //读取缓冲区的换行
gets(c);
for(i=0;i
G Traffic
题目是说有东西和南北两个方向的车,东西方向的车只需按照自己原来的时间经过交叉路口即可,而南北方向的所有车必须等待相同的时间,然后两个方向的车都开始行驶,但不会发生任何碰撞,即要从 0 开始找到一个时间 t 加到南北方向上所有车的通过时间上,若都没有和东西方向的车发生碰撞,则说明该 t 就是最短的等待时间。
题意不好理解,但理解后AC不难。
#include
#include
int a[3005],b[2005];
int main()
{
int n,m,i,j;
while(scanf("%d%d",&n,&m)!=EOF)
{
int k;
memset(a,0,sizeof(a)); //将a、b数组初始化为0
memset(b,0,sizeof(b));
for(i=0;i
H Rng
需要较好数学功底和逆元知识,难度较大,参考链接:
Rng
I Budget
将输入的数字看作字符串来处理,找到小数点后三位的数并判断即可
#include
char num[30]; //储存数字的字符数组,注意要足够大
int find(char c)
{
int i;
for(i=0;i<30;++i){
if(num[i]==c)
return i;
else if(num[i]=='\0')
break;
}
return -1;
}
int main()
{
int n,i,sum;
int a,tmp;
while(scanf("%d",&n)!=EOF){
sum=0;
for(i=0;i
J Worker
要使每个仓库的搬运数量相等,即每个仓库的a[i]*b[i](b[i]分配到这个仓库的工人)相等,即搬运数量是所有a[i]的公倍数,可以先求出最小公倍数s,让sum+=s/a[i],得出sum就是最小的工人数量,只有m%sum==0即工人数量是sum的整数倍时才输出Yes
注意有些变量要用long long以防止数据超出int范围
#include
typedef long long LL; //将长整型long long int命名为LL
//用long long确保数据不会超出范围
LL gcd(LL a,LL b){ //辗转相除求最大公因数
if(b==0)
return a;
return gcd(b,a%b);
}
LL lcm(LL a,LL b){ //求最小公倍数
return a/gcd(a,b)*b;
}
int main() {
LL n,m,i;
LL a[1005];
while(scanf("%lld%lld",&n,&m)!=EOF){
LL lcmAll = 1;
for(i=0;i
K Class
基础的解方程
#include
int main()
{
int x,y;
int a,b;
scanf("%d%d",&x,&y);
a=(x+y)/2;
b=x-a;
printf("%d\n",a*b);
return 0;
}
祝大家天天AC