(假期第一次比较正式的一次队内练习赛)还是圳爷发挥好 现学凸包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 计算几何 队友说写个凸包 然后暴力判断即可