Codeforces Round#655(Div。2)問題解決ABCD

質問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;
}

おすすめ

転載: blog.csdn.net/weixin_45755679/article/details/107294954