A题,426A,Sereja and Mugs
题目意思:有n-1个小伙伴,n个杯子,里面分别装有水,每个小伙伴可以选择一杯水,问总共加起来会不会超过给的S
解题思路:
这个还要说吗?
/*************************************************************************
> File Name: 1.cpp
> Author: boblee
> Mail: boblee0717@gmail.com
> Created Time: 2014年04月28日 星期一 19时16分09秒
************************************************************************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100+20;
int mug[maxn];
int n,s;
int main()
{
while(~scanf("%d%d",&n,&s))
{
for(int i=1;i<=n;i++)
scanf("%d",&mug[i]);
sort(mug+1,mug+1+n);
int sum = 0;
int i;
for(i=1;i<n;i++)
{
sum+=mug[i];
if(sum > s)
break;
}
if(i<n)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}
B,426B, Sereja and Mirroring
题目意思:给你一个矩阵a,如果是严格对称的,必须是偶对称,就消去下半部分,问最后剩多少部分
解题思路:
每次就模拟,可以就消去,不可以就退出输出
/*************************************************************************
> File Name: 2.cpp
> Author: boblee
> Mail: boblee0717@gmail.com
> Created Time: 2014年04月28日 星期一 19时35分20秒
************************************************************************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
const int maxn=100+20;
string s[maxn];
char s2[10*maxn];
int n,m;
bool check(int x)
{
if(x&1)
return false;
for(int i=1,j=x;i<j;i++,j--)
{
if(s[i]!=s[j])
return false;
}
return true;
}
int main()
{
while(~scanf("%d%d\n",&n,&m))
{
for(int i=1;i<=n;i++)
{
gets(s2);
s[i] = string(s2);
}
if(n&1)
printf("%d\n",n);
else
{
bool flag = check(n);
while(n%2==0 && flag)
{
n = n/2;
flag = check(n);
}
printf("%d\n",n);
}
}
return 0;
}
C,425A, Sereja and Swaps
题目意思:给n个数,你最多可以交换k次,问最后的最大连续和
解题思路:
因为n很小,可以暴力枚举,但是枚举也是有艺术的,我开始完全不知道怎么枚举。
就是枚举区间,然后只能用区间外的去交换区间里面的,最后找出最大的那一个
/*************************************************************************
> File Name: 3.cpp
> Author: boblee
> Mail: boblee0717@gmail.com
> Created Time: 2014年04月28日 星期一 20时59分51秒
************************************************************************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=200+20;
int a[maxn];
int sum[maxn];
bool vis[maxn];
int n,k;
const int INF = 0X3F3F3F3F;
int cal(int l,int r)
{
priority_queue<int,vector<int>,greater<int> > q;
int ret = 0;
memset(vis,false,sizeof(vis));
for(int i=l;i<=r;i++)
{
ret += a[i];
q.push(a[i]);
}
int ktmp = k;
while(ktmp > 0)
{
int maxt = -INF;
int maxv;
for(int i=1;i<=n;i++)
{
if((i>=l && i<=r) || vis[i]) continue;
if(a[i] > maxt)
{
maxt = a[i];
maxv = i;
}
}
if(maxt > q.top())
{
ret = ret-q.top()+maxt;
vis[maxv] = true;
q.pop();
q.push(maxt);
}
ktmp--;
}
return ret;
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
memset(sum,0,sizeof(sum));
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum[i] = sum[i-1]+a[i];
}
int ans = -INF;
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
int tmp = cal(i,j);
if(tmp > ans)
ans = tmp;
}
}
printf("%d\n",ans);
}
return 0;
}