A题,426A,Sereja and Mugs
题目意思:有n-1个小伙伴,n个杯子,里面分别装有水,每个小伙伴可以选择一杯水,问总共加起来会不会超过给的S
解题思路:
这个还要说吗?
/************************************************************************* > File Name: 1.cpp > Author: boblee > Mail: [email protected] > 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: [email protected] > 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: [email protected] > 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; }
codeforces_#243 (Div.2),码迷,mamicode.com
时间: 2024-10-17 13:40:30