中国(北方)大学生程序设计训练赛(第二周) (A B D G)

比赛链接

A题是KMP,先把A拼接到B的后面,然后利用next数组的意义(包括其具体含义,以及失配时的应用),得到ans

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3
 4 char T[200005],S[200005];
 5 int tlen,slen;
 6 int Next[200005];
 7
 8 void getNext()
 9 {
10     int j=0,k=-1;
11     Next[0]=-1;
12     while(j<tlen)
13         if(k==-1||T[j]==T[k])
14             Next[++j]=++k;
15         else
16             k=Next[k];
17 }
18
19 int cal(int x)
20 {
21     int ret=0;
22     while(Next[x]!=-1)
23     {
24         x=Next[x];
25         ret++;
26     }
27     return ret;
28 }
29
30 int main()
31 {
32     //freopen("test.txt","r",stdin);
33     int TT;scanf("%d",&TT);
34     while(TT--)
35     {
36         scanf("%s%s",S,T);
37         int x=min(strlen(S),strlen(T));
38         strcat(T,S);
39         tlen=strlen(T);
40         getNext();
41         int len=min(Next[tlen],x);
42         int t=cal(len);
43         printf("%d\n",t);
44
45     }
46 }

A

B算是数学题吧,对于同一个数,如果是整数,怎样操作都不会对difference有影响,而取ceil和取floor则恰好使difference差1,想明白这点就好了

代码自己没写,贴个链接。。 http://blog.csdn.net/mz839555819/article/details/47844275

D是DP,转移方程见代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4
 5 LL n,x,y,ans;
 6 LL dp[10000007];
 7
 8 int main()
 9 {
10     //freopen("test.txt","r",stdin);
11     while(cin>>n>>x>>y)
12     {
13         memset(dp,0x3f3f3f3f,sizeof(dp));
14         ans=0;
15         dp[1]=x;dp[0]=0;
16         for(int i=2;i<=n+1;i++)
17         {
18             if(i&1)
19                 dp[i]=min(dp[i-1]+x,dp[(i+1)/2]+x+y);
20             else
21                 dp[i]=min(dp[i-1]+x,dp[i/2]+y);
22         }
23         cout<<dp[n]<<endl;
24     }
25 }

D

G题并查集,不同节点构成连通分量数 在这里等于 不同质因子的构成连通分量数。

具体一些细节: 1是特例; 只有质因子存在于图中时才要考虑该质因子

p.s. 分解质因数,素数筛 心里存个固定的板子真心好~

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 typedef long long LL;
  4
  5 const int N=1e6+3;
  6 int not_prime[N+5];
  7 vector<int> prime;
  8 bool vis[N+5];        //图中存在label,使i是label的质因数
  9 bool done[N+5];        //这一连通分量是否已被计数
 10 int p[N+5];
 11 int T,kase;
 12
 13 int Find(int x)
 14 {
 15     return x==p[x]? x:p[x]=Find(p[x]);
 16 }
 17 void Union(int x,int y)
 18 {
 19     x=Find(x),y=Find(y);
 20     p[x]=y;
 21 }
 22
 23 void init()
 24 {
 25     for(int i=2;i<=N;i++)
 26     {
 27         if(!not_prime[i])
 28         {
 29             //printf("%d=====\n",i);
 30             prime.push_back(i);
 31             for(LL j=(LL)i*i;j<=N;j+=i)
 32                 not_prime[j]=true;
 33         }
 34     }
 35 }
 36 int init1()
 37 {
 38     for(int i=1;i<=N;i++)
 39         p[i]=i;
 40     memset(vis,false,sizeof(vis));
 41     memset(done,false,sizeof(done));
 42 }
 43
 44 void getFactors(int x)
 45 {
 46     vector<int> a;
 47     for(int i=0;prime[i]*prime[i]<=x;i++)
 48     {
 49         if(x%prime[i]==0)
 50         {
 51             a.push_back(prime[i]),vis[prime[i]]=true;
 52             while(x%prime[i]==0) x/=prime[i];
 53         }
 54     }
 55     if(x>1) a.push_back(x),vis[x]=true;
 56     for(int i=1;i<a.size();i++)
 57         Union(a[0],a[i]);
 58 }
 59
 60 int solve()
 61 {
 62     int ret=0;
 63     for(int i=0;i<prime.size();i++)
 64     {
 65         if(vis[prime[i]])
 66         {
 67             int t=Find(prime[i]);
 68             if(!done[t])
 69             {
 70                 ret++;
 71                 //printf("===%d====",t);
 72                 done[t]=true;
 73             }
 74         }
 75     }
 76     return ret;
 77 }
 78
 79 int main()
 80 {
 81     init();
 82     //freopen("test.txt","r",stdin);
 83     scanf("%d",&T);
 84     while(T--)
 85     {
 86         init1();
 87         int ans=0;
 88         int n;
 89         scanf("%d",&n);
 90         for(int i=0;i<n;i++)
 91         {
 92             int t;
 93             scanf("%d",&t);
 94             if(t==1)
 95             {
 96                 ans++;
 97                 continue;
 98             }
 99             getFactors(t);
100         }
101         ans+=solve();
102         printf("Case %d: %d\n",++kase,ans);
103     }
104 }

G

时间: 2024-11-08 12:15:34

中国(北方)大学生程序设计训练赛(第二周) (A B D G)的相关文章

中国(北方)大学生程序设计训练赛(第一周)

比赛链接 D题是个二分,每次check复杂度为O(n),类似于xdu_1068,只是一个是求积,一个是求商 #include<bits/stdc++.h> using namespace std; typedef long long LL; typedef long double LF; const LF eps=1e-8; int a[100005],bb[100005]; LF b[100005]; LL A,B; LL K; LL rankof(LF x) { LL ans = 0,no

201671010117 2016-2017-2 《Java程序设计》Java第二周学习心得

Java第二周学习心得 这一周老师在周四进行了课堂测验,完全出乎我的意料,我以为老师会在前两周上课讲一下,由于我在课前没有好好准备,反转课堂来的有的措手不及,那些题很多很多都不会,也错了很多,班上有很多表现很好的同学,他们课前准备充分,在课堂上完全没有任何压力,我也意识到了我课前没有花大量时间看书的严重性,所以我下课便去看第三章了,以后也一定要好好看书,找出不懂得问题,课上也要认真向其他优秀同学学习,不懂的问题也要想办法解决. 今天写了PPT上的任务1-9,着实也遇到了很多不会的问题,像是最后的

201777010217-金云馨《面向对象程序设计(Java)》第二周学习总结

项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/11475377.html 作业学习目标 学习并掌握Java Application程序结构: 学习并掌握Java语言的数据类型与变量: 学会使用Java运算符构造各类表达式: 掌握Java Application输入输出技术: 掌握Java流程控制技术(分支.循环): 掌握Math类.Strin

网易云课堂_C语言程序设计进阶_第二周:指针:取地址运算和指针、使用指针、指针与数组、指针与函数、指针与const、指针运算、动态内存分配_2信号报告

2 信号报告(5分) 题目内容: 无线电台的RS制信号报告是由三两个部分组成的: R(Readability) 信号可辨度即清晰度. S(Strength)    信号强度即大小. 其中R位于报告第一位,共分5级,用1—5数字表示. 1---Unreadable 2---Barely readable, occasional words distinguishable 3---Readable with considerable difficulty 4---Readable with prac

201771010123汪慧和《面向对象程序设计Java》第二周学习总结

一.理论知识部分 1.标识符由字母.下划线.美元符号和数字组成, 且第一个符号不能为数字.标识符可用作: 类名.变量名.方法名.数组名.文件名等.第二部分:理论知识学习部分 2.关键字就是Java语言中已经被赋予特定意义 的一些单词. ?常见有:class.public.try.catch.if. float.import.void等. 关键字不做变量名. 3.Java有三种注释的方式:   // 注释内容由//一直到此行结束. /*和*/ 定义一个注释块.  /**开始,*/结束 这种注释方法

Contest1592 - 2018-2019赛季多校联合新生训练赛第二场(部分题解)

D 10248 修建高楼 D 传送门 题干 题目描述 C 市有一条东西走向的"市河".C 市的市长打算在"市河"的其中一条岸边自东往西的 n 个位置(可以将这 n 个位置看成在一条直线上,且位置不会重叠)依次建造高楼. C 市的设计部门设计了 T 个方案供市长挑选(方案编号为 1 到 T).每个方案都提供了建造的每幢高楼的高度,自东向西依次为 h1,h2,h3,-,hn-1,hn.每幢楼房的高度在 1 到 n 之间(包括 1 和 n),且各不相同. 市长在挑选设计方

2019个人训练赛第二场-A - BowWow and the Timetable

题意: 大概就是给你一串二进制的数,然后让你求log(4)s吧,刚开始找错方向,先把它转成十进制,结果数太大 解决方法: 大概是分析这个数如果正好是4的幂次方的话在二进制的表示里应该只有一个1,所以分析数的长度就可以 #include<bits/stdc++.h> using namespace std; int main(){ string s; cin>>s; for(int i=1;i < s.size();i++){ if(s[i] == '1'){ cout<

2016年中国大学生程序设计竞赛(合肥)-重现赛1008 HDU 5968

异或密码 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 19    Accepted Submission(s): 9 Problem Description 晨晨在纸上写了一个长度为N的非负整数序列{ai }.对于这个序列的一个连续子序列{al,al+1,…,ar }晨晨可以求出其中所有数异或的结果 alxoral+1xor...xo

2016年中国大学生程序设计竞赛(合肥)-重现赛1001 HDU 5961

传递 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 42    Accepted Submission(s): 16 Problem Description 我们称一个有向图G是传递的,当且仅当对任意三个不同的顶点a,,若G中有 一条边从a到b且有一条边从b到c ,则G中同样有一条边从a到c.我们称图G是一个竞赛图,当且仅当它是一个有