https://vjudge.net/contest/172194#problem/I
这题很绝望。。。一直做不出来。。
看了别人的代码后发现自己好傻逼。。
https://vjudge.net/contest/172194#problem/B
虽然知道是贪心,但是不知道为什么总是没写对。。
看来我的代码不够优雅。。。
看了大佬的,,真好。 而且更多的思考。就是不用判断是
lower_bound(+1) 因为如果最小的很不是最大的都可以》s了
那么最大的一定是运一次 。。
**
int l=0,r=n+1;//看别人,这种写法比较优雅?
int tol=0,cnt=0;
while(l+1!=r){
if(l+2==r){
ans[++cnt]=a[l+1];
tol++;
break;
}
if(a[l+1]+a[r-1]>k){
ans[++cnt]=a[++l];
ans[++cnt]=a[--r];
tol+=2;
}else{
ans[++cnt]=a[++l];
ans[++cnt]=a[++l];
tol++;
}
}**
https://vjudge.net/contest/172313#problem/A
km算法的模板题,不过还是要看别人的算法实现。。
int w[maxn][maxn];
int x[maxn],y[maxn],S[maxn],T[maxn];
int pre[maxn];
int slack;
int n;
bool find(int id){
S[id]=true;
for(int i=1;i<=n;++i){
if(x[id]+y[i]==w[id][i]&&!T[i]){
T[i]=true;
if(pre[i]==-1||find(pre[i])){
pre[i]=id;
return true;
}
}else if(x[id]+y[i]>w[id][i]){
slack=min(slack,x[id]+y[i]-w[id][i]);
}
}
return false;
}
void update(){
for(int i=1;i<=n;++i){
if(S[i])x[i]-=slack;
if(T[i])y[i]+=slack;
}
}
void km(){
for(int i=1;i<=n;++i){
x[i]=y[i]=0;pre[i]=-1;
for(int j=1;j<=n;++j){
x[i]=max(x[i],w[i][j]);
}
}
for(int i=1;i<=n;++i){
while(1){
for(int j=1;j<=n;++j)S[j]=T[j]=false;
slack=INF;
if(find(i))break;
else update();
}
}
int ans=0;
for(int i=1;i<=n;++i){
ans+=x[i]+y[i];
}
pf("%d\n",ans);
}
https://vjudge.net/contest/171669#problem/F
这题还是看了键哥给我的题解才知道的。。。
这里存约数