BZOJ 3767: A+B Prlblem加强版:BZOJ 很少见的水题 高精加 python水过
1 a=int(raw_input()) 2 b=int(raw_input()) 3 print a+b
BZOJ 3043: IncDec Sequence:差分过后就成了要使差分数列全为0的最小次数,第二问即将差分数列全削成正数或负数后,剩下的操作可以作用在前一段区间,也可以后一段区间,因此会造成不同数列的情况
/************************************************************** Problem: 3043 User: love_zyf Language: C++ Result: Accepted Time:332 ms Memory:2836 kb Description 给定一个长度为n的数列{a1,a2...an},每次可以选择一个区间[l,r],使这个区间内的数都加一或者都减一。 问至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列有多少种。 Input 第一行一个正整数n 接下来n行,每行一个整数,第i+1行的整数表示ai。 。 Output 第一行输出最少操作次数 第二行输出最终能得到多少种结果 Sample Input 4 1 1 2 2 Sample Output 1 2 HINT 对于100%的数据,n=100000,0<=ai<2147483648 ****************************************************************/ //uva #include <stdio.h> #include <iostream> #include <string.h> #include <algorithm> #include <queue> #define maxn 100009 #define esp 0.001 using namespace std; long long a[maxn],b[maxn],c=0,d=0; int main() { int n; scanf("%d%lld",&n,&a[1]); for(int i=2;i<=n;i++) { scanf("%lld",&a[i]); b[i]=a[i]-a[i-1]; if(b[i]>0)c+=b[i];if(b[i]<0)d-=b[i]; } printf("%lld %lld ",max(c,d),abs(c-d)+1); return 0; }
POJ 2181 Jumping Cows:一开始看错题意,以为是连续的,样例答案怎么也没推出来,看清题意后发现是DP,dp[i][0]表示到第i个数,第i个数是选出的数的奇数项的最大值,dp[i][1]表示使偶数项时的最大值,转移很显然 见代码
1 //dp[i][0]=max(dp[i-1][1]+a[i],a[i]);dp[i][1]=dp[i-1][0]-a[i]; 2 #include <stdio.h> 3 #include <iostream> 4 #include <string.h> 5 #include <algorithm> 6 #include <queue> 7 #define maxn 150090 8 #define esp 0.001 9 #define inf 0x3f3f3f3f 10 int max(int x,int y){return x<y?y:x;} 11 using namespace std; 12 int dp[maxn][2]; 13 int main() 14 { 15 int n,x,y,z,ans=0,sign=1; 16 scanf("%d",&n); 17 for(int i=1;i<=n;i++,sign*=-1) 18 { 19 scanf("%d",&x); 20 dp[i][0]=max(dp[i-1][1]+x,dp[i-1][0]); 21 dp[i][1]=max(dp[i-1][1],dp[i-1][0]-x); 22 ans=max(ans,max(dp[i][0],dp[i][1])); 23 // printf("%d %d ",dp[i][0],dp[i][1]); 24 } 25 printf("%d ",ans); 26 return 0; 27 }
POJ 1258 Agri-Net:裸MST
1 #include <stdio.h> 2 #include <iostream> 3 #include <string.h> 4 #include <algorithm> 5 #include <queue> 6 #define maxn 3000 7 #define esp 0.001 8 #define inf 0x3f3f3f3f 9 using namespace std; 10 int father[maxn],dis[maxn][maxn]; 11 struct T 12 { 13 int x; 14 int y; 15 int v; 16 }a[maxn*1000]; 17 int cmp(T x,T y) 18 { 19 return x.v<y.v; 20 } 21 int find(int x) 22 { 23 if(x==father[x])return x; 24 return father[x]=find(father[x]); 25 } 26 int main() 27 { 28 int n,i; 29 while(scanf("%d",&n)!=EOF) 30 { 31 int h=0,ans=0; 32 for(i=1;i<=n;i++)father[i]=i; 33 for(i=1;i<=n;i++) 34 { 35 for(int j=1;j<=n;j++)scanf("%d",&dis[i][j]); 36 } 37 for(int i=1;i<=n;i++) 38 { 39 for(int j=1;j<i;j++)if(dis[i][j]!=0) 40 { 41 a[++h].x=i; 42 a[h].y=j; 43 a[h].v=dis[i][j]; 44 } 45 } 46 sort(a+1,a+1+h,cmp); 47 for(i=1;i<=h;i++) 48 { 49 int xx=find(a[i].x),yy=find(a[i].y); 50 if(xx!=yy) 51 { 52 father[xx]=yy; 53 ans+=a[i].v; 54 } 55 } 56 printf("%d ",ans); 57 } 58 return 0; 59 }
POJ 1251 Jungle Roads:同上 裸MST
1 #include <stdio.h> 2 #include <iostream> 3 #include <string.h> 4 #include <algorithm> 5 #include <queue> 6 #define maxn 100009 7 #define esp 0.001 8 #define inf 0x3f3f3f3f 9 using namespace std; 10 int h,father[maxn]; 11 int find(int x) 12 { 13 if(x==father[x])return x; 14 return father[x]=find(father[x]); 15 } 16 struct T{int x;int y;int v;}a[maxn]; 17 int cmp(T x,T y){return x.v<y.v;} 18 int main() 19 { 20 int n,i; 21 char ch[10],ch2[10]; 22 while (1) 23 { 24 h=0; 25 int ans=0,m,x; 26 scanf("%d",&n); 27 if(n==0)break; 28 for(int i=1;i<=n;i++)father[i]=i; 29 for(i=1;i<=n-1;i++) 30 { 31 scanf("%s%d",ch,&m); 32 for(int j=1;j<=m;j++) 33 { 34 scanf("%s%d",ch2,&x); 35 a[++h].x=(int)ch[0]-'A'+1; 36 a[h].y=(int)ch2[0]-'A'+1; 37 a[h].v=x; 38 } 39 } 40 sort(a+1,a+1+h,cmp); 41 for(i=1;i<=h;i++) 42 { 43 int xx=find(a[i].x),yy=find(a[i].y); 44 if(xx!=yy) 45 { 46 ans+=a[i].v; 47 father[xx]=yy; 48 } 49 } 50 printf("%d ",ans); 51 } 52 return 0; 53 }
POJ 2976 Dropping tests:裸的01分数规划
1 #include <stdio.h> 2 #include <iostream> 3 4 #include <string.h> 5 6 #include <algorithm> 7 8 #include <queue> 9 10 #define maxn 200090 11 12 #define esp 0.00001 13 14 #define inf 0x3f3f3f3f 15 16 using namespace std; 17 18 int n,k,a[maxn],b[maxn]; 19 20 double c[maxn]; 21 22 int judge(double x) 23 24 { 25 26 double ans=0; 27 28 for(int i=1;i<=n;i++)c[i]=(double)a[i]-x*b[i]; 29 30 sort(c+1,c+1+n); 31 32 for(int i=k+1;i<=n;i++)ans+=c[i]; 33 34 if(ans>0)return 1;else return 0; 35 36 } 37 38 int main() 39 40 { 41 42 while(1) 43 44 { 45 46 scanf("%d%d",&n,&k); 47 48 if(n==0&&k==0)break; 49 50 for(int i=1;i<=n;i++)scanf("%d",&a[i]); 51 52 for(int i=1;i<=n;i++)scanf("%d",&b[i]); 53 54 double l=0,r=1000; 55 56 while(r-l>esp) 57 58 { 59 60 double mid=(r+l)/2; 61 62 if(judge(mid)==1)l=mid;else r=mid; 63 64 } 65 printf("%d ",(int)(l*100+0.5)); 66 67 } 68 return 0; 69 70 } 71 72
POJ 1014 Dividing:做多重背包即可,需要二进制优化,另外行尾需要空行 不然PE
1 #include <stdio.h> 2 #include <iostream> 3 #include <string.h> 4 #include <algorithm> 5 #include <queue> 6 #define maxn 1200090 7 #define esp 0.00001 8 #define inf 0x3f3f3f3f 9 using namespace std; 10 int a[10],value[maxn],h=0; 11 bool dp[maxn]; 12 int main() 13 { 14 int cas=0; 15 while(1) 16 { 17 int sum=0;h=0; 18 memset(dp,0,sizeof(dp)); 19 scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6]); 20 if((a[1]|a[2]|a[3]|a[4]|a[5]|a[6])==0)break; 21 for(int i=1;i<=6;i++)sum+=i*a[i]; 22 if((sum&1)==1) 23 { 24 printf("Collection #%d: Can't be divided. ",++cas); 25 continue; 26 } 27 sum>>=1; 28 for(int k=1;k<=6;k++) 29 { 30 int t=1; 31 while(t<=a[k]) 32 { 33 value[++h]=t*k; 34 a[k]-=t; 35 t<<=1; 36 } 37 if(a[k]>0)value[++h]=a[k]*k; 38 } 39 dp[0]=1; 40 for(int i=1;i<=h;i++) 41 { 42 for(int j=sum;j>=0;j--) 43 { 44 if(j-value[i]>=0)dp[j]=dp[j]|dp[j-value[i]]; 45 } 46 } 47 if(dp[sum]==1) 48 printf("Collection #%d: Can be divided. ",++cas); 49 else printf("Collection #%d: Can't be divided. ",++cas); 50 } 51 return 0; 52 }
POJ 1862:stripies:最大的数显然要根号很多次 放进一个堆里面,然后每次将最大的两个数合并即可
1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 #include<algorithm> 5 #include<math.h> 6 #define maxn 100009 7 using namespace std; 8 int a[maxn]; 9 priority_queue<double>q; 10 int main() 11 { 12 int n,x; 13 scanf("%d",&n); 14 for(int i=1;i<=n;i++) 15 { 16 scanf("%d",&x); 17 q.push((double)x); 18 } 19 for(int i=1;i<=n-1;i++) 20 { 21 double u=q.top(); 22 q.pop(); 23 double v=q.top(); 24 q.pop(); 25 q.push(1.0*2*sqrt((double)u*v)); 26 } 27 double u=q.top(); 28 printf("%.3lf ",u); 29 return 0; 30 }
POJ 3785 The Next Permutation:next_permutation大法好
1 #include<cstdio> 2 #include<string.h> 3 #include<iostream> 4 #include<algorithm> 5 #define maxn 6000 6 using namespace std; 7 int main() 8 { 9 int t,cas; 10 char ch[1000000]; 11 scanf("%d",&t); 12 while(t--) 13 { 14 scanf("%d%s",&cas,ch+1); 15 int len=strlen(ch+1); 16 int flag=0; 17 for(int i=2;i<=len;i++) 18 { 19 if(ch[i]>ch[i-1]){flag=1;break;} 20 } 21 if(flag==0) 22 { 23 printf("%d BIGGEST ",cas); 24 continue; 25 } 26 next_permutation(ch+1,ch+1+len); 27 printf("%d %s ",cas,ch+1); 28 } 29 return 0; 30 }
POJ 3782 Equal Sum Partitions:数据很水很水很水很水,暴力一发即可
1 #include<cstdio> 2 #include<string.h> 3 #include<iostream> 4 #include<algorithm> 5 #define maxn 6000900 6 using namespace std; 7 int a[maxn]; 8 int main() 9 { 10 int t,cas,n,temp; 11 scanf("%d",&t); 12 while(t--) 13 { 14 int sum=0,s=0; 15 scanf("%d%d",&cas,&n); 16 for(int i=1;i<=n;i++){scanf("%d",&a[i]);s+=a[i];} 17 for(int i=1;i<=n;i++) 18 { 19 int flag=0; 20 sum+=a[i]; 21 if(sum>(s>>1)){printf("%d %d ",cas,s);break;} 22 temp=0; 23 for(int j=i+1;j<=n;j++) 24 { 25 temp+=a[j]; 26 if(temp>sum){flag=1;break;} 27 if(temp==sum)temp=0; 28 } 29 if(flag==0 && temp==0) 30 { 31 printf("%d %d ",cas,sum); 32 break; 33 } 34 } 35 } 36 return 0; 37 }
POJ 3192 DNA Assembly:论暴力的正确姿势
1 #include<cstdio> 2 #include<string.h> 3 #include<iostream> 4 #include<algorithm> 5 #include<queue> 6 #include<map> 7 #define maxn 400009 8 #define maxm 4000009 9 using namespace std; 10 char ch[10][10000],ans[maxn]; 11 int prem[maxn]; 12 int main() 13 { 14 int n,s=1,minx=0x3f3f3f3f; 15 scanf("%d",&n); 16 for(int i=1;i<=n;i++) 17 { 18 s*=i; 19 prem[i]=i; 20 scanf("%s",ch[i]+1); 21 } 22 for(int uu=1;uu<=s;uu++) 23 { 24 memset(ans,0,sizeof(ans)); 25 int now=0; 26 for(int j=1;j<=n;j++) 27 { 28 int p=prem[j],u=strlen(ch[p]+1),ansn=now+1; 29 for(int i=max(now-u+1,1);i<=now;i++) 30 { 31 int idx=i; 32 while(ch[p][idx-i+1]==ans[idx]&&idx<=now) 33 idx++; 34 if(idx==now+1){ansn=i;break;} 35 } 36 for(int i=ansn;i<=ansn+u;i++) 37 ans[i]=ch[p][i-ansn+1]; 38 now=ansn+u-1; 39 } 40 if(now<minx)minx=now; 41 next_permutation(prem+1,prem+1+n); 42 } 43 printf("%d ",minx); 44 return 0; 45 }
POJ 1094 Sorting It All Out
1 #include<cstdio> 2 #include<iostream> 3 #include<string.h> 4 #include<map> 5 #include<algorithm> 6 #define maxn 10000 7 using namespace std; 8 int a[100][100],b[100][100],n,m,ansn[maxn]; 9 int floyd() 10 { 11 int res=0; 12 for(int k=1;k<=n;k++) 13 { 14 for(int i=1;i<=n;i++)if(i!=k) 15 { 16 for(int j=1;j<=n;j++)if(j!=i&&j!=k) 17 { 18 b[i][j]=b[i][j]|(b[i][k]&b[k][j]); 19 } 20 } 21 } 22 for(int i=1;i<=n;i++) 23 { 24 for(int j=1;j<=n;j++) 25 { 26 if(b[i][j])res++; 27 if(b[i][j]&&b[j][i]) 28 return -1; 29 } 30 } 31 if(res==((n*(n-1))>>1))return 1; 32 return 0; 33 } 34 int main() 35 { 36 while(1) 37 { 38 char c1,c2;int ans=-1,flag=0,ans2=-1; 39 scanf("%d%d",&n,&m); 40 memset(a,0,sizeof(a)); 41 memset(ansn,0,sizeof(ansn)); 42 if(n==0&&m==0)break; 43 getchar(); 44 for(int i=1;i<=m;i++) 45 { 46 scanf("%c<%c",&c1,&c2); 47 getchar(); 48 if(flag==0) 49 { 50 a[c1-'A'+1][c2-'A'+1]=1; 51 memcpy(b,a,sizeof(a)); 52 int u=floyd(); 53 if(u==1) 54 {ans=i;flag=1;} 55 else if(u==-1) 56 { 57 ans2=i; 58 flag=1; 59 } 60 } 61 } 62 if(ans!=-1) 63 { 64 memcpy(b,a,sizeof(a)); 65 floyd(); 66 for(int i=1;i<=n;i++) 67 { 68 int flag=0; 69 for(int j=1;j<=n;j++) 70 { 71 if(b[i][j]==1)flag++; 72 } 73 ansn[n-flag]=i; 74 } 75 printf("Sorted sequence determined after %d relations: ",ans); 76 for(int i=1;i<=n;i++) 77 { 78 printf("%c",(char)(ansn[i]-1+'A')); 79 } 80 printf(". "); 81 } 82 else if(ans2!=-1) 83 { 84 printf("Inconsistency found after %d relations. ",ans2); 85 } 86 else printf("Sorted sequence cannot be determined. "); 87 } 88 return 0; 89 }