思路: 大水杯的水是累计的..定定要改掉自己读题猴急的毛病!!
CODE:
#include <iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
int a[105],s=0;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
for(int i=0;i<n-1;i++)
s+=a[i];
if(s<=m) printf("YES\n");
else printf("NO\n");
}
return 0;
}
题意: 要求找到给出的数组成像的最小行数..
思路: 将行数除以2 进行匹配, 若对称, 则继续除以2, 直到 不对称或者 行数为奇数为止; 若行数一开始便为奇数 即为答案~
小技巧: 因为输入的数据仅为0,1 , 则可以吧每行数串都看成二进制~
CODE:
#include<stdio.h>
#include<iostream>
using namespace std;
int a[105][105];
int main()
{
//freopen("in.in","r",stdio);
int x,y;
while(~scanf("%d%d",&x,&y))
{
for(int i=0;i<x;i++)
{
for(int j=0;j<y;j++)
{
scanf("%d",&a[i][j]);
}
}
if(x%2) printf("%d\n",x);
else
{
int ok=1;
while(ok)
{
x=x/2;
for(int i=x-1,j=x;i>=0;j++,i--)
{
for(int k=0;k<y;k++)
{
if(a[i][k]!=a[j][k])
{
ok=0;
break;
}
if(!ok) break;
}
}
if(x%2==1&&ok)
{
printf("%d\n",x);
break;
}
}
if(!ok)printf("%d\n",x*2);
}
}
return 0;
}
CODE2 (使用二进制)
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
int a[105]={0};
int x,y;
while(~scanf("%d%d",&x,&y))
{
int n;
for(int i=0;i<x;i++)
{
for(int j=0;j<y;j++)
{
scanf("%d",&n);
a[i]*=2;
a[i]+=n;
}
}
if(x%2) printf("%d\n",x);
else
{
int ok=1;
while(ok)
{
x=x/2;
for(int i=x-1,j=x;i>=0;i--,j++)
{
if(a[i]!=a[j])
{
ok=0;break;
}
if(!ok) break;
}
if(x%2==1&&ok)
{
printf("%d\n",x);
break;
}
}
if(!ok)printf("%d\n",x*2);
}
}
return 0;
}
C. Sereja and Swaps
题意:找到和最大的连续子序列,输出和
思路: 暴力枚举, 并且不需要将原数列中的数进行 交换, 只需要求出差即可...代码能力呀0.0
#include <iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int INF=0xffffff;
int num[205],sum[210],s1[210],s2[210];
int work(int *s,int le,int ri)
{
for(int i=le;i<ri;i++,s++)
*s=num[i];
return ri-le;
}
int main()
{
// freopen("in.in","r",stdin);
int n,k;
int nn;
while(~scanf("%d%d",&n,&k))
{
sum[0]=0;
for(int i=0;i<n;i++)
{
scanf("%d",&num[i]);
sum[i+1]=sum[i]+num[i];
}
int ans=-INF;
for(int i=0;i<n;i++)
for(int j=i+1;j<=n;j++)
{
ans=max(ans,sum[j]-sum[i]);
int ls1=work(s1,i,j);
int ls2=work(s2,0,i);
int ls22=work(s2+ls2,j,n);
int l2=ls2+ls22;
sort(s1,s1+ls1);
sort(s2,s2+l2);
l2--;
int t=0,com=0,f=0;
while(s2[l2]>s1[f] && t<k && l2>=0 && f<ls1)
{
com+=s2[l2]-s1[f];
f++,l2--;
t++;
}
ans=max(ans,sum[j]-sum[i]+com);
}
printf("%d\n",ans);
}
return 0;
}