Codeforces Round #197 (Div. 2)

来源:互联网 发布:mac iphoto可以删除吗 编辑:程序博客网 时间:2024/05/16 08:36

A:把式子中的数字小的提到前面来

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<algorithm>using namespace std;char s[110];int main(){while(scanf("%s",s)!=EOF){if(strlen(s)==1) printf("%s\n",s);else{int a[110];int num=0;for(int i=0;s[i];i++){if(s[i]>='1'&&s[i]<='3') a[num++]=s[i]-'0';}sort(a,a+num);for(int i=0;i<num;i++){if(i==0) printf("%d",a[i]);else printf("+%d",a[i]);}printf("\n");}}//system("pause");return 0;}

B:有n个House围城一个圈,你有m个任务要做,每个任务在某一个House,做任务的顺序不许改变,你只能顺时针围着这n个房子转圈...

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<algorithm>using namespace std;typedef long long ll;int n,m;ll ans;int a[100000+5];int main(){while(scanf("%d%d",&n,&m)!=EOF){for(int i=1;i<=m;i++) scanf("%d",&a[i]);ans=a[1]-1;int t=a[1];for(int i=2;i<=m;i++){if(t==a[i]) continue;else {if(a[i]>t) ans+=(ll)(a[i]-t);else ans+=(n-t)+(ll)a[i];t=a[i];}}printf("%I64d\n",ans);}//system("pause");return 0;}

C:有一些物品,每种物品有无限个,每种物品有自己的重量,你要放m个物品到两个容器中,要求两个容器要交替使用,连续两次取得物品不能相同,你放了一件物品在一个容器内后,他的重量必须大于另一个.

用DFS可以搞出来==

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<vector>#include<algorithm>using namespace std;typedef long long ll;char s[12];int m;int ans[1000];int tag;int sum[2];vector<int>e;inline void dfs(int sum[],int flag,int num,int p){if(num>=m){tag=1;return;}if(!tag){for(int i=0;i<e.size()&&!tag;i++){if(sum[flag]+e[i]>sum[flag^1]&&e[i]!=p){ans[num]=e[i];sum[flag]+=e[i];dfs(sum,flag^1,num+1,e[i]);//ans[num]=0;sum[flag]-=e[i];}}}}int main(){while(scanf("%s",s)!=EOF){e.clear();scanf("%d",&m);for(int i=0;s[i];i++)if(s[i]=='1') e.push_back(i+1);if(e.size()==0) printf("NO\n");else {if(m==1) {printf("YES\n%d\n",e[0]);}else{tag=0;memset(ans,0,sizeof(ans));sum[0]=sum[1]=0;dfs(sum,0,0,-1);if(!tag) printf("NO\n");else{printf("YES\n");for(int i=0;i<m;i++){if(i+1<m) printf("%d ",ans[i]);else      printf("%d\n",ans[i]);}}}}}//system("pause");return 0;}


D:线段树,需记录层数,以此来确定向上更新操作时,是按位或还是异或.


#include<stdio.h>#include<stdlib.h>#define N 140000int a[N];int n,m;struct node{int l,r,num,tag;}root[N*4];void build(int t,int x,int y,int tag){root[t].tag=tag;root[t].l=x;root[t].r=y;if(x==y){root[t].num=a[x];return;}int m=(x+y)>>1;build(t*2,x,m,tag+1);build(t*2+1,m+1,y,tag+1);if(root[t].tag%2==n%2)root[t].num=root[t*2].num^root[t*2+1].num;elseroot[t].num=root[t*2].num|root[t*2+1].num;}void Modefiy(int t,int x,int val){int l=root[t].l;int r=root[t].r;if(l==r) {root[t].num=val;return;}int m=(l+r)>>1;if(x<=m) Modefiy(t*2,x,val);else     Modefiy(t*2+1,x,val);if(root[t].tag%2==n%2)root[t].num=root[t*2].num^root[t*2+1].num;elseroot[t].num=root[t*2].num|root[t*2+1].num;}int main(){while(~scanf("%d%d",&n,&m)){for(int i=1;i<=(1<<n);i++)scanf("%d",&a[i]);build(1,1,1<<n,0);for(int i=1;i<=m;i++){int p,b;scanf("%d%d",&p,&b);Modefiy(1,p,b);printf("%d\n",root[1].num);}}//system("pause");return 0;}