ねえ、ひどいので2問出題して19点落としました~~
A-ジャグリングレター
各文字の出現回数を数えます。最後のものが各配列に均等に分配されるため、各文字の出現回数はnの倍数である必要があります
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
int cnt[30];
int main()
{
IO;
int T;
cin>>T;
while(T--)
{
memset(cnt,0,sizeof cnt);
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
string s;
cin>>s;
for(auto t:s) cnt[t-'a']++;
}
bool ok=1;
for(int i=0;i<26;i++)
if(cnt[i]%n)
{
ok=0;
break;
}
if(ok) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
B-電源シーケンス
この質問は暴力的です。形而上学の複雑さを乗り越える方法がわかりません。
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=100010;
const ll maxn=1e17;
ll a[N];
int main()
{
IO;
int n;
cin>>n;
ll maxa=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
maxa=max(maxa,a[i]);
}
sort(a,a+n);
ll res=maxn;
for(int i=1;i<=100000;i++)
{
ll cnt=abs(a[0]-1);
ll p=1;
bool ok=1;
for(int j=1;j<n;j++)
{
if(p>maxn/i)
{
ok=0;
break;
}
p=p*i;
cnt+=abs(p-a[j]);
}
if(ok) res=min(res,cnt);
}
cout<<res<<endl;
return 0;
}
C-長さの倍数
非常に良い思考の質問、私はそれを期待していませんでした。。。
最初に、1からn-1までのすべての数値をnの倍数にして、nの倍数にするa[i]+a[i]*(n-1)
必要があります。次に、最後の数は0になり、3番目の部分は配列全体を0に削除します
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=100010;
int n,a[N];
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
if(n==1)
{
cout<<1<<' '<<1<<'\n'<<-a[1]<<'\n';
cout<<1<<' '<<1<<"\n0\n";
cout<<1<<' '<<1<<"\n0\n";
}
else
{
cout<<1<<' '<<n-1<<'\n';
for(int i=1;i<=n-1;i++) cout<<1ll*a[i]*(n-1)<<' ';
cout<<'\n'<<n<<' '<<n<<'\n';
cout<<-a[n];
cout<<'\n'<<1<<' '<<n<<'\n';
for(int i=1;i<=n;i++)
{
if(i==n) cout<<0<<' ';
else cout<<-1ll*a[i]*n<<' ';
}
}
return 0;
}
試験を受けるとき、私はlen1の前半をnの倍数に変更し、次にlen2の後半をnの倍数に変更したいと考えました。加数がnの倍数になり得るかどうかは不確かに思われます。ここでai + k 1 lenが必要です1 = k 2 n a_i + k_1len_1 = k_2na私+k1l e n1=k2n即k 1 len 1 + k 2 n = ai k_1len_1 + k_2n = a_ik1l e n1+k2ん=a私拡張ユークリッドアルゴリズムによれば、k 1 len 1 + k 2 n = gcd(len 1、n)k_1len_1 + k_2n = gcd(len_1、n)k1l e n1+k2ん=g c d (l e n1、n ) ifai%gcd(len 1、n)a_i \%gcd(len_1、n)a私%g c d (l e n1、n )が 0ではないため、解決策はありません。Dを調べたところ、NIMゲーム(後で貪欲であることがわかった)のように見え、それを見たくなく、眠りに落ちました。
しかし、解決策を読んだ後、len 1 = n − 1 len_1 = n-1の場合、l e n1=ん−1、次にgcd(len 1、n)= 1 gcd(len_1、n)= 1g c d (l e n1、n )=1解決できない状況はありません。
D-ストーンゲーム
両方の当事者が石の数が最も多いパイルを選択するたびに、最善の解決策です。優先度キューを使用して、ストーンをフェッチするプロセスをシミュレートできます。以下のコードは、YeHoseaの問題解決を参照しています。
石の山が合計の半分を超えている場合、最初の手が勝ちます。それがパリティの議論を超えない場合は
、表を使用して法則を見つけることができます。結論は次のコードと同じです
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=110;
int n,a[N];
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>n;
int maxa=0;
int s=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
s+=a[i];
maxa=max(maxa,a[i]);
}
if(s-maxa<maxa||s%2==1) cout<<"T"<<endl;
else cout<<"HL"<<endl;
}
return 0;
}
質問を補足すると、今回はdiv2はそれほど難しくないことがわかりましたが、もっと考える質問が多かったので、落ち着いて考える必要があります。
さあ〜