AmazingCounters.com

水过的题

BZOJ 3767: A+B Prlblem加强版:BZOJ 很少见的水题 高精加 python水过

1 a=int(raw_input())
2 b=int(raw_input())
3 print a+b
View Code

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\n%lld\n",max(c,d),abs(c-d)+1);
    return 0;
}
View Code

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\n",dp[i][0],dp[i][1]);
24     }
25     printf("%d\n",ans);
26     return 0;
27 }
View Code

 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\n",ans);
57     }
58     return 0;
59 }
View Code

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\n",ans);
51     }
52     return 0;
53 }
View Code

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\n",(int)(l*100+0.5));
66 
67     }
68     return 0;
69 
70 }
71 
72  
View Code

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:\nCan't be divided.\n\n",++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:\nCan be divided.\n\n",++cas);
49         else printf("Collection #%d:\nCan't be divided.\n\n",++cas);
50     }
51     return 0;
52 }
View Code

 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\n",u);
29     return 0;
30 }
View Code

 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\n",cas);
24             continue;
25         }
26         next_permutation(ch+1,ch+1+len);
27         printf("%d %s\n",cas,ch+1);
28     }
29     return 0;
30 }
View Code

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\n",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\n",cas,sum);
32                 break;
33             }
34         }
35     }
36     return 0;
37 }
View Code

 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\n",minx);
44     return 0;
45 }
View Code

 

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(".\n");
81         }
82         else if(ans2!=-1)
83         {
84             printf("Inconsistency found after %d relations.\n",ans2);
85         }
86         else printf("Sorted sequence cannot be determined.\n");
87     }
88     return 0;
89 }
View Code

 

posted @ 2014-11-26 18:11  philippica  阅读(265)  评论(0编辑  收藏  举报