上菜
#include <iostream> #include <set> #include <iostream> #include <cstring> #include <queue> #include <math.h> #include <map> #include <string> #include <cstdio> #include <algorithm> using namespace std; const int maxn=1e5+10; int a[maxn],b[maxn],c[maxn]={0},d[maxn],out,n,flag,num; set<int> s; set<int> nums; inline int read(){ int x=0,f=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } inline void sort(int a[],int n) { int temp; for(int i=0;i<n-1;i++) { for(int j=0;j<n-i-1;j++) { if(a[j]<a[j+1]) { temp=a[j+1]; a[j+1]=a[j]; a[j]=temp; } } } } int main() { int t=read(); for(int i=1;i<=t;i++) { int n=read(),min1=1e5+10,coun=0,sum=0,desk=n-1; for(int j=0;j<n;j++){ c[j]=read();if(j>0)c[j]+=c[j-1]; // if(c[j]>max1)max1=c[j]; // if(c[j]<max1)c } for(int j=0;j<n;j++){ int p=read(); min1=a[j]=min(p,min1); } memcpy(d,c,sizeof(c)); int temp; for(int j=0;j<n-1;j++) { for(int g=0;g<n-j-1;g++) if(d[g]>d[g+1]) { //cout<<d[g]<<" "<<d[g+1]<<endl; temp=d[g+1]; d[g+1]=d[g]; d[g]=temp; //cout<<d[g]<<" "<<d[g+1]<<endl; } //cout<<d[n-1-j]<<endl; for(int k=desk;k>=0;k--) { if(c[k]==d[n-1-j]) { if(a[k]!=coun){ sum+=c[k]*(a[k]-coun); coun=a[k]; desk=k-1; } //cout<<sum<<endl; break; } } } cout<<"Case #"<<i<<": "<<a[0]<<' '<<sum<<endl; } return 0; }
游戏
#include <iostream> #include <set> #include <iostream> #include <cstring> #include <queue> #include <math.h> #include <map> #include <string> #include <cstdio> #include <algorithm> using namespace std; const int maxn=1e5+10; int a[maxn],b[maxn],out,n,flag,num; set<int> s; set<int> nums; inline int read(){ int x=0,f=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } inline void dfs(int c,int m) { if(flag) { if(m==n) { if(c>out)out=c; if(out==num)flag=0; //cout<<3<<endl; return; } if(s.insert(a[m]).second) { dfs(c+1,m+1);s.erase(s.find(a[m])); //cout<<1<<endl; //cout<<' '<<a[m]<<endl; } //cout<<m<<endl; if(s.insert(b[m]).second) { dfs(c+1,m+1);s.erase(s.find(b[m])); //cout<<2<<endl; } dfs(c,m+1); } } inline void clean() { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); s.clear(); nums.clear(); out=0; flag=1; } int main() { int t; t=read(); for(int j=1;j<=t;j++) { n=read(); clean(); for(int i=0;i<n;i++) { a[i]=read();b[i]=read(); } nums.insert(a,a+n-1); nums.insert(b,b+n-1); num=nums.size(); dfs(0,0); cout<<"Case #"<<j<<": "<<out<<endl; } return 0; }