Codeforces 973 div2
A:Zhan's Blender
點選檢視程式碼
void solve() {
int n,x,y;
cin>>n>>x>>y;
int ans=0;
if(x>=y) {
ans=n/y;
if(n%y) ans++;
}
else {
ans=n/x;
if(n%x) ans++;
}
cout<<ans<<endl;
}
#B:Battle for Servive
點選檢視程式碼
void solve() {
int n;cin>>n;
int a[n+1]={};
int sum=0;
for(int i=1;i<=n;i++) {
cin>>a[i];
if(i<=n-2) sum+=a[i];
}
cout<<a[n]-a[n-1]+sum<<endl;
}
#C:Password Cracking
> > 互動題
點選檢視程式碼
const int maxn=2e6+5;
int h[maxn];
int ask(string s){
cout << "? " << s << endl;
cout.flush();
int x;
cin >> x;
return x;
}
void solve(){
int n;
cin >> n;
string s;
if ( ask("0") ) s = "0";
else s = "1";
while ( s.length() < n ){
if ( ask(s + '0') ){
s += '0';
}else if ( ask(s + '1') ){
s += '1';
}else{
break;
}
}
while ( s.length() < n ){
if ( ask('0' + s) ){
s = '0' + s;
}else{
s = '1' + s;
}
}
cout << "! " << s << endl;
cout.flush();
}
signed main(){
int T;
cin >> T;
while (T -- ) solve();
return 0;
}
#D:Minimize the Difference
> > 原理:本位只能變小,後繼增大。如果陣列為單調遞增,那麼a[n]-a[1]。如果單調遞減,從前往後那麼需要透過本位減,後繼加取不同個step所選陣列的平均值來維護最小值;從後往前需要透過本位加,前驅減取不同step所選陣列的平均值來維護最大值。其中最大值,最小值結果為最優解的結果。補充:本題有向上取整的方法。
點選檢視程式碼
const int N=2e5+10;
const i64 INF=0x3f3f3f3f3f3f3f;
i64 a[N];
void solve() {
i64 n;cin>>n;
i64 s=0,mi=INF,ma=-INF;
for(i64 i=1;i<=n;i++) {
cin>>a[i];
}
for(i64 i=1;i<=n;i++) {
s+=a[i];
mi=min(mi,s/i);
}//從頭開始不斷求字首序列的平均值,可能達到可能達不到。取平均值維護最小值
s=0;
for(i64 i=n;i>=1;i--) {
s+=a[i];
ma=max(ma,(s+n-i)/(n-i+1));//向上取整,平均值維護最大值:向上取整的方式需要記住!
}
cout<<ma-mi<<endl;
}
#E:Prefix GCD
> > 原理:相當於我建立了一個新陣列,ans[i]儲存原來最優排序後的前i位的GCD。此時先把整個陣列的最大公約數除去,簡便運算,避免超時。再對於ans陣列一位一位去儲存最優解,最優解則需要遍歷原array,使得字首gcd取得最小值,以此來維護ans陣列。補充:_gcd(,)為algorithm自帶函式,不需要編寫gcd了。
點選檢視程式碼
const ll N=2e5+5;
const ll mod=1e9+7;
ll a[N];
ll vis[N];
void solve() {
ll n,cnt=0,p=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
vis[i]=0;
}
vis[1]=1;
ll id=1;
sort(a+1,a+1+n);
for(int i=1;i<=n;i++)
{
p=__gcd(p,a[i]);
}
ll ans=a[1],s=a[1],mi=a[1];
while(1)
{
s=mi;
ll t=0,cnt=0;
for(int i=2;i<=n;i++)
{
if(vis[i])
{
continue;
}
t=__gcd(s,a[i]);
if(t<=mi)
{
mi=t;
id=i;
cnt++;
}
}
if(cnt)
{
vis[id]=1;
ans+=mi;
}
else
{
break;
}
if(mi==p)
{
break;
}
}
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
ans+=p;
}
}
cout<<ans<<"\n";
}