模拟题组

以下几个题目来自于:浙大计算机研究生保研复试上机考试-2011年题组。

晚上没什么事做着试了一下,没想到是三道模拟题,正巧很久没有做过这种模拟了,不过速度是慢了很多。

hdu 3792  Twin Prime Conjecture

英文是硬伤,借助百度翻译才看懂这是求孪生素数数目的题目。没有n的范围,假设1000000用筛法打表之后求和。一开始对于时间估计过于乐观,求孪生素数没和求和写在一起,超时了一次。

另外:

memset是对每个字节赋值,而int有4字节(32位) 比如这样,memset(a,1,sizeof(a)); 则a中的每个元素都被赋值成为2进制数为,00000001000000010000000100000001,的数转换成10进制就是16843009所以,一般用memset对数组赋0或-1,赋其他的值就要用循环来实现。

 

 1 #include
 2 #include<string.h>
 3 #define MAX 1000000
 4 int a[MAX]={1};
 5 int ans[MAX]={0};
 6 int main ()
 7 {
 8     for(int i=2;i)
 9         a[i]=1;
10     a[0]=a[1]=0;
11     for(int i=2;i)
12     {
13         if(a[i]==1)
14         {
15             int delt=2;
16             int base=i;
17             for(int k=base*delt;kbase*delt)
18             {
19                 a[k]=0;
20                 delt++;
21             }
22         }
23     }
24     for(int i=2;i)
25     {
26         if(a[i]==1&&a[i-2]==1)
27             ans[i]=ans[i-1]+1;
28         else
29             ans[i]=ans[i-1];
30     }
31     int n;
32     while(scanf("%d",&n)&&n>0)
33     {
34 
35         printf("%d\n",ans[n]);
36     }
37     return 0;
38 }
hdu 3792

 

hdu 3793  Is It Symmetric

一个循环字符串,找这个圈的对称中心,而且限定了只有一个对称中心,长度小于100。

考虑了一会,没想到什么靠谱的算法,于是还是暴力吧,挨个字符过。TLE了两次,因为没有考虑单个字符的情况,而第一遍改还没改的很完善。

 1 #include
 2 #include<string.h>
 3 char str[102];
 4 int main()
 5 {
 6     while(scanf("%s",str))
 7     {
 8         int length=strlen(str);
 9         int flag=0;
10         if(length==1&&str[0]=='#')break;
11         if(length==1)
12         {
13             printf("YES %d\n",0);
14             flag=1;
15         }
16         else
17         {
18             for(int i=0;i)
19             {
20                 int j=1;int max=length/2;
21                 while(str[(i+j)%length]==str[((i-j)+length)%length])
22                 {
23                     if(j==max)
24                     {
25                         flag=1;
26                         printf("YES %d\n",i);break;
27                     }
28                     j++;
29                 }
30 
31             }
32         }
33         if(flag==0)
34             printf("NO\n");
35     }
36     return 0;
37 }
hdu 3793

 

hdu 3794  Magic Coupon

才看到题目以为是个dp,结果捉急的英文理解清楚之后发现也是模拟,说好听点是贪心。

排个序,两边算正的结果就加进最后的结果里。代码wa了很多次,后来发现是因为存储的数据也应经超出int的范围了。

 1 #include
 2 #include
 3 using namespace std;
 4 __int64 nc[1000010];
 5 __int64 np[1000010];
 6 int main()
 7 {
 8     __int64 ans;
 9     int c,p;
10     while(scanf("%d",&c))
11     {
12         if(c<0)break;
13         else
14         {
15             int fc=c,fp;
16             ans=0;
17             for(int i=0;i)
18                 scanf("%I64d",&nc[i]);
19             sort(nc,nc+c);
20             for(int i=0;i)
21                 if(nc[i]>0)
22                 {
23                     fc=i;break;
24                 }
25             scanf("%d",&p);
26             fp=p;
27             for(int i=0;i)
28                 scanf("%I64d",&np[i]);
29             sort(np,np+p);
30             for(int i=0;i)
31                 if(np[i]>0)
32                 {
33                     fp=i;break;
34                 }
35             int ci=c-1;int pi=p-1;
36             while(ci>=fc&&pi>=fp)
37             {
38                 ans+=nc[ci]*np[pi];
39                 ci--;
40                 pi--;
41             }
42             ci=0,pi=0;
43             while(cifp)
44             {
45                 ans+=nc[ci]*np[pi];
46                 ci++;
47                 pi++;
48             }
49             printf("%I64d\n",ans);
50         }
51     }
52 }
hdu 3794

 

hdu 3795  Diff

题目是有点麻烦,有点麻烦。

 

转载于:https://www.cnblogs.com/holyprince/p/3315967.html

你可能感兴趣的:(模拟题组)