質問A:
すべての要素が1に設定されている限り、水の質問。
コード:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
using namespace std;
typedef long long ll;
const int MAXN=2e5+5;
const int mod=1e9+7;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cout<<1<<" ";
}
cout<<endl;
}
}
質問B:
a <= bと仮定すると、bがaの倍数である場合、lcm(a、b)は最小値、つまりb = kaを達成することがわかります。次に、a + ka = n、(k + 1)a = n、kが小さいほど、aとbが近くなり、bが小さくなり、lcm(a、b)が小さくなります。次に、nの最小係数(1を除く)を見つけて、それを取り除きます。
コード:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
using namespace std;
typedef long long ll;
const int MAXN=2e5+5;
const int mod=1e9+7;
ll gcd(ll a, ll b)
{
if (b == 0)
return a;
else if (a < b)
return gcd(b, a);
else
return gcd(b, a % b);
}
ll lcm(ll a, ll b)
{
return a / gcd(a, b) * b;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
if(n==2)
{
cout<<1<<" "<<1<<endl;
continue;
}
if(n==3)
{
cout<<1<<" "<<2<<endl;
continue;
}
int a1,b1;
int f=-1;
for(int i=2;i<=sqrt(n);i++)
{
if(n%i==0)
{
f=1;
a1=n/i;
b1=n-a1;
break;
}
}
if(f==1) cout<<min(a1,b1)<<" "<<max(a1,b1)<<endl;
else cout<<1<<" "<<n-1<<endl;
}
}
質問C:
配列内のすべてのa [i] = iの場合、答えは間違いなく0です。連続した間隔(l = <i <= r)a [i]!= iしかない場合は、間隔を直接操作します。数はa [i] = iになり、答えは1です。要件を満たしていない連続した間隔が2つ以上ある場合、最初の段落の開始位置Lと最後の段落の終了位置Rを記録できます。1つの操作を使用して、最初に要件を満たさない間隔を変更します。 a [i] = iの場合、最後の間隔の最初の-1の位置から最初の段落の最初まで、それは不十分になる可能性があり、次に別の操作を使用してこの間隔を合法にします。完了するのに2回しかかからず、答えは2です。
コード:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
#include<vector>
using namespace std;
#define iis std::ios::sync_with_stdio(false); cin.tie(0)
typedef long long ll;
const int MAXN=2e5+5;
const int inf=0x3f3f3f3f;
int a[MAXN];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
int ans=0;
int f=0;
for(int i=1;i<=n;i++)
{
if(a[i]!=i)
{
if(f==0)
{
f=1;
ans++;
}
}
else f=0;
}
if(ans==0) cout<<0<<endl;
else if(ans==1) cout<<1<<endl;
else cout<<2<<endl;
}
}
質問D:
ゲーム中に書き留めていませんでした。ボスのアイデアを読んだ後は、おそらく次のようになります。i番目の桁を最後まで保持する必要があると想定し、左を見ると、i-1番目の桁を削除して左端まで移動する必要があります。押して、1に達すると、残りの番号が1つになるまで左にnになります。iが奇数の場合、iの前の偶数位置が削除され、奇数の位置が保持され、iの後の奇数の位置が削除され、偶数の位置が保持されます。それ以外の場合、iが偶数の場合、iの前の奇数の位置が削除されます。削除すると、i以降の偶数位置が削除されます。
たとえば、1 2 3 4 5 67。
保持する4を選択したら、3削除—> 1 6 5 6 7、削除1 ----> 5 6 13、削除6 ----> 18。
保持する5を選択すると、4削除—> 1 2 8 6 7、削除2 ----> 6 7 9、削除7 ----> 15。
したがって、予約する位置を列挙し、プレフィックスを使用して答えを見つけます。
コード:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
using namespace std;
typedef long long ll;
const int MAXN=2e5+5;
const int mod=1e9+7;
ll s[MAXN];
ll a[4][MAXN];
int main()
{
int n;
cin>>n;
a[1][0]=0;
a[2][0]=0;
for(int i=1;i<=n;i++)
{
cin>>s[i];
a[1][i]=a[1][i-1];
a[2][i]=a[2][i-1];
if(i&1) a[1][i]+=s[i];
else a[2][i]+=s[i];
}
ll ans=0;
for(int i=1;i<=n;i++)
{
if(i&1)
{
ans=max(a[1][i]+a[2][n]-a[2][i],ans);
}
else
{
ans=max(ans,a[2][i]+a[1][n]-a[1][i]);
}
}
cout<<ans<<endl;
}