ACM ICPC 2017 Warmup Contest 3
(假期第一次比较正式的一次队内练习赛)还是圳爷发挥好 现学凸包A题 弱鸡只能签道切个打表题
A 队友直接广搜A掉
C 按照一定规则染色 最终使每块颜色不同的最小花费
#include <bits/stdc++.h> #define ll long long using namespace std; struct cmp{ bool operator()(ll x,ll y){ return x>y; } }; int main(){ int T;scanf("%d",&T); int n; priority_queue<ll,vector<ll>,cmp >que; while(T--){ scanf("%d",&n); ll aa; for(int i=1;i<=n;i++){ scanf("%lld",&aa);que.push(aa); } long long ans=0; while(que.size()>1){ ll t1=que.top();que.pop();ll t2=que.top();que.pop(); ans+=(t1+t2); que.push(t1+t2); } while(!que.empty()) que.pop(); printf("%lld\n",ans); } return 0; }
D 签到题
#include <bits/stdc++.h> using namespace std; int a[105]; typedef struct node{ int x;int y; friend bool operator<(node a,node b){ if(a.x==b.x) return a.y<b.y; return a.x>b.x; } }node; node b[105]; int main(){ int n,m;cin>>n>>m; memset(a,0,sizeof(a)); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ a[i+j]++; } } int u=0; for(int i=2;i<=m+n;i++){ if(a[i]!=0){ b[++u].x=a[i];b[u].y=i; } } sort(b+1,b+u+1); printf("%d\n",b[1].y); for(int i=2;i<=u;i++){ if(b[i].x==b[i-1].x){ printf("%d\n",b[i].y); } else break; } return 0; }
F 网络流裸题 队友板子速切
H 打表题 枚举AB串 统计所有满足的情况 排序二分即可(没注意Int会爆 WA了两发
#include <bits/stdc++.h> using namespace std; string a[64]; string b[64]; long long p[64]; long long vis[5005]; int pos; long long zh(string c){ long long sum=0; int t=c.size(); for(int i=t-1;i>=0;i--){ sum+=((c[i]-'0')*p[t-1-i]); } return sum; } long long pow(int x){ long long sum=1; for(int i=1;i<=x;i++) sum*=2; return sum; } void csh(){ pos=0;string s; for(int i=0;i<63;i++){ vis[++pos]=zh(a[i]); for(int j=0;j<62;j++){ int id=1; s=a[i]; while(s.size()<64){ if(id&1) {s+=b[j];id++;} else {s+=a[i];id++;} if(s.size()<64) vis[++pos]=zh(s); } s.clear(); } } } int main(){ a[0]="1";b[0]="0"; for(int i=0;i<=63;i++) p[i]=pow(i); for(int i=1;i<=63;i++){ a[i]=a[i-1]+"1"; b[i]=b[i-1]+"0"; } csh(); sort(vis+1,vis+pos+1); long long n,m;cin>>n>>m; if(n==0&&m==0) cout<<0<<endl; else{ int l=1;int r=pos;int ans1; while(l<=r){ int mid=(l+r)>>1; if(vis[mid]>=n){ ans1=mid;r=mid-1; } else l=mid+1; } l=1;r=pos;int ans2; while(l<=r){ int mid=(l+r)>>1; if(vis[mid]<=m){ ans2=mid;l=mid+1; } else r=mid-1; } cout<<ans2-ans1+1<<endl;} return 0; }
J 计算几何 队友说写个凸包 然后暴力判断即可