关于军训的模拟赛-R2

Posted shzr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于军训的模拟赛-R2相关的知识,希望对你有一定的参考价值。

  终于我也参加了一场有R1 && R2的比赛呢。

  因为种种原因,老师认为上次的考试没有体现我们的真实水平,于是举办了毒瘤R2,其实也不是非常毒瘤,还是一贯的风格。

  T1 : profit

  概括题意:带点权的“没有上司的舞会”。然而题意有一点歧义,得看样例才能懂。

  技术分享图片
 1 # include <cstdio>
 2 # include <iostream>
 3 
 4 using namespace std;
 5 
 6 const int maxn=100009;
 7 int n,firs[maxn],h,x,y,dep[maxn];
 8 int a[maxn];
 9 long long dp[maxn][2];
10 struct edge
11 {
12     int too,nex;
13 }g[maxn<<1];
14 
15 void dfs (int x)
16 {
17     int j;
18     dp[x][0]=a[x];
19     for (int i=firs[x];i;i=g[i].nex)
20     {
21         j=g[i].too;
22         if(dep[j]) continue;
23         dep[j]=dep[x]+1;
24         dfs(j);
25         dp[x][0]+=dp[j][1];
26         dp[x][1]+=max(dp[j][1],dp[j][0]);
27     }
28 }
29 
30 void add (int x,int y)
31 {
32     g[++h].too=y;
33     g[h].nex=firs[x];
34     firs[x]=h;
35 }
36 
37 int main()
38 {
39     freopen("profit.in","r",stdin);
40     freopen("profit.out","w",stdout);
41     
42     scanf("%d",&n);
43     for (int i=1;i<=n;++i)
44         scanf("%d",&a[i]);
45     for (int i=1;i<n;++i)
46     {
47         scanf("%d%d",&x,&y);
48         add(x,y);
49         add(y,x);
50     }
51     dep[1]=1;
52     dfs(1);
53     printf("%lld",max(dp[1][0],dp[1][1]));
54     return 0;
55 }
profit

 

  T2 : Torch  

  任意给定一个正整数n(n<=100000),求一个最小的正整数m,使得n*m的十进制表示形式里只含有1和0。输入n如果有解输出m,无解则输出“No Solution”。

  首先写一个暴力,然后打表找规律,现在来看一下我打了哪些表:对于1-10000的答案,1-10000的二进制分解,答案的二进制分解,乘积的二进制分解,乘积分解质因数....于是这五个表都没啥用呢...真的找不到任何规律。后来想了一个方法优化暴力,直接枚举那个乘积,因为乘积只由0,1组成,可以用二进制来枚举,这样可以少枚举很多无效的情况,但是怎么判断无解呢?并没有什么办法,但是如果..乘积..超过longlong了是不是就不大好做了...所以只枚举乘积没有爆longlong的一些情况,如果这些都不出解就干脆输出无解好了。虽然看起来非常不科学,但是竟然A了...

  技术分享图片
 1 # include <cstdio>
 2 # include <iostream>
 3 
 4 using namespace std;
 5 
 6 int n,m;
 7 long long ans=0;
 8 int t[100],len;
 9 
10 long long check (int x)
11 {
12     long long an=0;
13     len=0;
14     while (x)
15     {
16         t[++len]=x%2;
17         x/=2;
18     }
19     for (int i=len;i>=1;--i)
20         an=an*10+t[i];
21     if(an<0) return -1;
22     if(an%n==0) return an/n;
23     return -1;
24 }
25 
26 int main()
27 {
28     freopen("torch.in","r",stdin);
29     freopen("torch.out","w",stdout);
30     
31     scanf("%d",&n);
32     for (int i=1;i<=1048600;++i)
33     {
34         ans=check(i);
35         if(ans!=-1)
36         {
37             cout<<ans;
38             fclose(stdin);
39             fclose(stdout);
40             return 0;
41         } 
42     }
43     printf("No Solution");
44     fclose(stdin);
45     fclose(stdout);
46     return 0;
47 }
Torch

 

 

  未完待续... ...

 

以上是关于关于军训的模拟赛-R2的主要内容,如果未能解决你的问题,请参考以下文章

[CSP-S模拟测试]:军训队列(DP+乱搞)

2017.10.30noip赛前集训 | T1 军训排队模拟

一个函数应该返回什么可以失败?

码神军训(四,五)——代码跳舞军体拳

しろは的军训列队

关于代码片段的时间复杂度