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#include #include #include 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 s) break; } if(i
B,426B,Sereja and Mirroring題目意思:給你一個矩陣a,如果是嚴格對稱的,必須是偶對稱,就消去下半部分,問最後剩多少部分
解題思路:
每次就模擬,可以就消去,不可以就退出輸出
/************************************************************************* > File Name: 2.cpp > Author: boblee > Mail: [email protected] > Created Time: 2014年04月28日 星期一 19時35分20秒 ************************************************************************/ #include#include #include #include #include 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
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#include #include #include #include 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 ,greater > 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; }