BC#54div2

中文题目链接

hdu:5427

不得不说,有时候人傻,真的是没救了,WA了N次,最后才发现字符串长度应该至少是105的,WA的惨死。。

关于字符串处理,真的是要靠思考方式来拯救的,比赛的时候还煞费心机的处理了串首空格的读入,最后还是fst了,事实上正确的打开方式只能是处理后5个字符。

还有就是真的又加深了对cmp和<号的重载,尽管至今对于其中迭代器的原理不理解。

 1 #include<cstdio>
 2 #include<map>
 3 #include<queue>
 4 #include<stack>
 5 #include<vector>
 6 #include<algorithm>
 7 #include<cstring>
 8 #include<cmath>
 9 #include<iostream>
10 #include<set>
11 #include<stdlib.h>
12 using namespace std;
13 struct Node{
14     char str[120];
15     int len;
16     int date=0;
17     bool operator<(const Node &b)const{
18         return date>b.date;
19     } 
20 }per[120];
21 int n,t;
22 bool cmp(const Node x,const Node y)
23 {
24     return x.date>y.date;
25 }
26 int main()
27 {
28     cin>>n;
29     getchar();
30     while(n--)
31     {
32         cin>>t;
33         getchar();
34         for(int i=0;i<t;i++)
35         {
36             per[i].date=0;
37             gets(per[i].str);
38             per[i].len=strlen(per[i].str);
39             for(int j=per[i].len-4;j<per[i].len;j++)
40             {
41                 per[i].date=per[i].date*10+per[i].str[j]-'0';
42             } 
43             per[i].len-=5;
44             per[i].str[per[i].len]='\0';
45         }
46         //cout<<i<<endl;
47         sort(per,per+t);
48         for(int i=0;i<t;i++)
49 //        printf("%s\n",per[i].str);
50         puts(per[i].str);
51     }
52     return 0;
53 }
View Code

hdu5428

细节问题:等号,数值是long long

题意是要找到每个数中的质数因子,取最小的两个因子,并输出二数的积。

主要是对于题意的解析上面,当时读题的时候自己把题目复杂化了,以为要先判断是不是质数,如果不是质数就把所有质数因子找出来并取最小的两个质数。然而每次还要保留最小的两个质数,需要比较大小。

然而,真正简单分析起来,其实只需要每次把所有的质数因子或者质数本身存储在数组里面,当然我也想过会爆数组大小,不过最终还是没有爆的。数最大是2e9,而且每个质数会反复存进数组里面去,数据特别大的情况下应该还是会WA掉的。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<vector>
 5 #include<set>
 6 #include<map>
 7 #include<stack>
 8 #include<Queue>
 9 #include<string>
10 #include<string.h>
11 #include<cmath>
12 #include<math.h>
13 #include<stdio.h>
14 #include<float.h>
15 #include<stdlib.h>
16 #define N 100005
17 
18 using namespace std;
19 
20 int main()
21 {
22 //    cout<<"jjj";
23     int t,n;
24     long long a[105],num[N];
25     cin>>t;
26     while(t--){
27         cin>>n;
28     //    cout<<n<<"qq"<<endl;
29         int len=0;
30         for(int i=0;i<n;i++)
31         {
32             cin>>a[i];
33         //    cout<<n;
34             for(int j=2;j*j<=a[i];)
35             {
36                 //cout<<a[i]<<endl;
37                 while(a[i]%j==0){
38                     num[len++]=j;
39                     //cout<<num[len-1]<<"jj"<<a[i];
40                     a[i]/=j;
41                 }
42                 if(j==2) j++;
43                 else j+=2;
44             }
45             if(a[i]!=1)
46             num[len++]=a[i];
47         }
48         //cout<<num[0]<<"jjj"<<num[1]<<endl;
49         sort(num,num+len);
50         //cout<<num[0]<<" "<<num[1]<<endl;
51         long long res=num[0]*num[1];//爆int WA 了很多次 
52         if(len>=2)
53         cout<<res<<endl;
54         else
55         cout<<"-1"<<endl;
56     }
57     return 0;
58 }
View Code

hdu5429

等比的判断方法+大数处理

第一次JAVA交题

 1 import java.io.*;
 2 import java.math.BigInteger;
 3 import java.math.*;
 4 import java.util.*;
 5 //package 等比;
 6 //package BigInterger;
 7 /**
 8  *
 9  * @author ACMLAB-002
10  */
11 public class Main {
12 
13     /**
14      * @param args the command line arguments
15      */
16     public static void main(String[] args) {
17         BigDecimal[] s=new BigDecimal[105];
18         int T,n,flag,i,t;
19         BigDecimal a,b;
20         Scanner cin= new Scanner(System.in);
21         T=cin.nextInt();
22         while(T-->0){
23             n=cin.nextInt();
24             flag=1;
25             t=0;
26             for(i=0;i<n;i++){
27                 s[i]=cin.nextBigDecimal();
28                 if(s[i].compareTo(BigDecimal.valueOf(0))==0){
29                     t++;
30                 }
31             }
32             if(t==n||n==1){
33                 System.out.println("Yes");
34                 continue;
35             }
36             if(t!=0){
37                 System.out.println("No");
38                 continue;
39             }
40             for(i=1;i<n-1;i++){
41                 a=s[i].multiply(s[i]);
42                 b=s[i-1].multiply(s[i+1]);
43                 if(a.compareTo(b)!=0){
44                     flag=0;
45                     break;
46                 }
47             }
48             if(flag==0)
49                 System.out.println("No");
50             else
51                 System.out.println("Yes");
52         }
53         // TODO code application logic here
54     }
55 }
View Code

hdu5430

BC#54div2_第1张图片

既约分数,即最简分数:如果不是既约分数,则代表同一种反射方案循环多次。

两点之间与圆心角形成的最大角度是小于pi,即180度,所以要看k/(N+1)在0到1之间有多少取值。所以k的取值范围是[1,N]

 

 

 

 

其他,待补题hdu

你可能感兴趣的:(BC#54div2)