A.選三條相鄰的邊遍歷一次求最小值
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10,mod=1e9+7;
#define int long long
int n,m;
vector<int> g[N];
int a[N];
void solve()
{cin>>n;int res=2e18;for(int i=1;i<=n;i++) cin>>a[i];sort(a+1,a+1+n);for(int i=2;i<=n-1;i++){res=min(res,abs(a[i]-a[i-1]+abs(a[i]-a[i+1])));}cout<<res<<"\n";
}signed main()
{cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);int t=1;cin>>t;while(t--) solve();
}
B.手玩一下最后一層的每個點可以由哪些點轉移過來,可以觀察到直接涂兩邊是可以相等的
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10,mod=1e9+7;
#define int long long
int n,m;
vector<int> g[N];
int a[N];
int s[N];
int get(int l,int r){return s[r]-s[l-1];
}
int b[N];
void solve()
{cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){if(j==1||j==i) cout<<1<<" ";else cout<<0<<" ";}cout<<"\n";}
}signed main()
{cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);int t=1;cin>>t;while(t--) solve();
}
C.貪心,從小到大選數,能去掉就去掉
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10,mod=1e9+7;
#define int long long
int n,m;
vector<int> g[N];
int a[N];
void solve()
{int res=0;cin>>n;string s;cin>>s;s="?"+s;vector<bool> st(n+10);for(int i=1;i<=n;i++){for(int j=i;j<=n;j+=i){if(st[j]) continue;if(s[j]=='0'){st[j]=true;res+=i;}else break;}}cout<<res<<"\n";
}signed main()
{cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);int t=1;cin>>t;while(t--) solve();
}
D:
要么到0要么到n+1,所以枚舉出去哪個口
然后就貪心,什么情況下去另一側,當然是去另一側能加血量,如果當前能加血量肯定優先加,再跑去當前要出的口子,所以預處理另一側加血量的貢獻和能加這個血量需要付出的條件即這個過程扣血量的最小值
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10,mod=1e9+7;
#define int long long
int n,m;
vector<int> g[N];
int a[N];
int s[N];
int get(int l,int r){return s[r]-s[l-1];
}
int b[N];
void solve()
{int k;cin>>n>>k;for(int i=1;i<=n;i++) cin>>a[i];auto check=[&](){int sum=0,mn=0;vector<int> nxt;vector<int> need;for(int i=k+1;i<=n;i++){sum+=a[i];mn=min(mn,sum);if(sum>0){nxt.push_back(sum);need.push_back(mn);sum=0;mn=0;}}int cur=a[k];for(int i=k,j=0;i;i--){while(j<nxt.size()&&cur+need[j]>=0){cur+=nxt[j];j++;}if(cur+a[i-1]<0) return false;cur+=a[i-1];}return true;};if(check()){cout<<"YES\n";return ;}reverse(a+1,a+1+n);k=n-k+1;if(check()){cout<<"YES\n";return ;}cout<<"NO\n";
}signed main()
{cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);int t=1;cin>>t;while(t--) solve();
}