牛客寒假算法训练营二题解(待补充)

这场cnz出的题,一位来自北京理工的金牌爷(被虐了)
C 处女座的砝码
链接:https://ac.nowcoder.com/acm/contest/327/C
来源:牛客网

处女座热爱做物理实验,为了实验,处女座必须要精确的知道物品的质量。处女座准备自己设计一套砝码,每一个砝码都是正整数,这套砝码必须能够精确测量出n以内所有正整数的质量,处女座想要知道至少需要多少个砝码。你可以在天平的任意一边放置砝码。
输入描述:
一行,一个正整数n1<=n<=101000
输出描述:
一个整数,表示最少的砝码数。
示例1

输入

20
输出

4
这其实是一个三进制问题,对每个砝码,可以放左边,右边或不放
知乎上有详细的证明:https://www.zhihu.com/question/30164499/answer/47003542
那么代码实现就很显然了(注意数据范围相当大,所以建议用Java或python,或者long double)

#include 
using namespace std;
 
typedef long long ll;
 
int main() {
    long double n, m=0;
    int i = 0;
     
    cin >> n;
     
    while(m < n) {
        i ++;
        m *= 3;
        m += 1;
    }
     
    printf("%d\n", i);
    return 0;
}

D 处女座与重修费
签到。

#include
int main(){
 int i,n,a[10005],cnt=0;
 scanf("%d",&n);
 for(i=0;i

E 处女座的测验
链接:https://ac.nowcoder.com/acm/contest/327/H
来源:牛客网

处女座进行了一场c语言的考试,要求很简单,输出2000个正整数,并且满足以下条件: 1. 任意两个数互质 2. 任意两个数x,y,满足r(xy)>10,其中r(n)为n的因子的个数
举例:6的因子有1,2,3,6,所以τ(6)=4τ(6)=4
输入描述:
本题没有输入
输出描述:
2000行,每行一个正整数输出的每个整数都必须在1-4
108之间如果有多组答案,输出任意一组即可。

刚开始看到这题想到了中国剩余定理,因为两两互质嘛,结果细想发现我只需要输出素数就好了鸭,设p,q,s,t为素数,记pq=x,st=y;
那么显然x,y互质,而r(x*y)=12>10;那么我们就已经构造出了答案。
代码如下:
(个人比较喜欢欧筛)

#include
#include 
#define N 100005
int prime[N],vis[N];
void getprime(){
 memset(vis,0,sizeof(vis));
 int i,j,count=0;
 for(i=2;i<=N;i++){
  if(!vis[i]) prime[++count] = i;//printf("prime[%d]=%d\n",count,prime[count]);
  for(j=1;j<=count&&i*prime[j]<=N;j++){
   vis[i*prime[j]]=1;
   if(i%prime[j]==0) break;
  }
 }
}
int main(){
 int i;
 getprime();
 for(i=1;i<=2000;i++) printf("%d\n",prime[i]*prime[4000-i+1]);
 return 0;
}

J 处女座的复习
链接:https://ac.nowcoder.com/acm/contest/327/J
来源:牛客网

快要期末考试了,处女座现在有n门课程需要考试,每一门课程需要花ai小时进行复习,考试的起始时间为bi,处女座为了考试可以不吃饭不睡觉,处女座想知道他能否复习完所有的科目(即在每一门考试之前复习完该科目)。每一门课的考试时间都为两小时。
输入描述:
第一行一个整数n第二行n个整数a1,a2,…,an,表示每门课需要复习的时间第三行n个整数b1,b2,…,bn,表示每门课考试的时间1<=n<=1050<=ai<=1090<=bi<=109
输出描述:
如果处女座能复习完,输出”YES”,否则输出”NO”
示例1
输入

3
0 1 1
2 6 4
输出

YES

贪心一点想,显然是应该根据考试时间来选择复习的课程。(一定要学会这该死的结构体排序哦 )

#include
#include
#include
using namespace std;
struct node{
 int a,b; 
}gg[100005];
int cmp(node x,node y){
 return x.bgg[0].a+c[i-1]){
    c[i]=c[i-1]+gg[i].a+2;
   }
   else {
    printf("NO");
    ok=0;
    break;
   }
  }
  if(ok==1) printf("YES");
 }
 else printf("NO");
 return 0;
}

待补充

你可能感兴趣的:(牛客寒假算法训练营二题解(待补充))