中文题目链接
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 }
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 }
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 }
hdu5430
既约分数,即最简分数:如果不是既约分数,则代表同一种反射方案循环多次。
两点之间与圆心角形成的最大角度是小于pi,即180度,所以要看k/(N+1)在0到1之间有多少取值。所以k的取值范围是[1,N]
其他,待补题hdu