焼きレジパズル(数学)
ここに写真の説明を挿入
この質問は判断する必要があるだけです。倍数は2の数であり、倍数は4の数です。2つの倍数が2の場合、2つの数値を取ることができ、1つの倍数が在这里插入代码片
4の場合、2つの数値を取ることができます。
#include<bits/stdc++.h>
#define maxn 15000
using namespace std;
int ans1,ans2,ans3;
int T,n,a[maxn];
int main()
{
cin>>T;
while(T--)
{
cin>>n;
ans1=ans2=ans3=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]%4==0)ans2++;
else if(a[i]%2==0)ans1++;
else ans3++;
}
if((ans1/2+ans2*2>=n-1)||(ans2-ans3>=0)||(ans3==ans2+1&&!ans1))cout<<"AWaDa!"<<endl;
else cout<<"AKTang!"<<endl;
}
return 0;
}
アッカのシーケンス(シミュレーション)
#include<bits/stdc++.h>
#define maxn 150000
using namespace std;
int a[maxn],n,m,tep;
int main()
{
cin>>n;tep=n;
for(int i=1;i<=n;i++)cin>>a[i];
cin>>m;
for(int i=1;i<=m;i++)
{
int x;cin>>x;
if(x==1)
{
int k;cin>>k;
int j=a[1];
for(int i=2;i<=tep+1;i++)//前面
{
int q=a[i];
a[i]=j;
j=q;
}
tep++;
a[1]=k;
}
else if(x==2)后面
{
int k;cin>>k;
a[++tep]=k;
}
else for(int i=1;i<=tep/2;i++)swap(a[i],a[tep-i+1]);turn
}
for(int i=1;i<=tep;i++)cout<<a[i]<<' ';
return 0;
}
ローストレジファイティングタイガース(列挙+分類ディスカッション)
最初にデータを前処理し、各タイガーと最初のタイガーの間の距離を計算してから、開始点を列挙し、2つのカテゴリで左または右について話し合います。タイガーによって追加された攻撃値=前のタイガーへの開始点であることがわかります。距離なので、この虎を打つことは2点の距離です
#include<bits/stdc++.h>
#define maxn 150
using namespace std;
int dp[maxn][maxn];
int n,ans,a[maxn],dis[maxn],k=1e6;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i],ans+=a[i];
dis[1]=0;
for(int i=1;i<n;i++)cin>>a[i],dis[i+1]+=a[i]+dis[i];
for(int i=1;i<=n;i++)
{
int neww=0;
for(int j=i-1;j>=1;j--)neww+=dis[i]-dis[j];//往左先
for(int j=i+1;j<=n;j++)neww+=dis[i]+dis[j];
k=min(k,neww);
neww=0;
for(int j=i+1;j<=n;j++)neww+=dis[j]-dis[i];//往右先
for(int j=i-1;j>=1;j--)neww+=2*dis[n]-dis[i]-dis[j];
k=min(k,neww);
}
cout<<ans+k;
return 0;
}
ローストして歌う
暴力的なdfsを始めた人、dfsの下の個人、毎回の計画の数++
#include<bits/stdc++.h>
#define maxn 150000
#define mo 998244353
using namespace std;
int a[maxn],tot,head[maxn],vis[maxn];
map<int,int>q[maxn];
int n,m,ans;
struct node
{
int next;
int to;
}edge[maxn];
void add(int u,int v)
{
++tot;
edge[tot].next=head[u];
edge[tot].to=v;
head[u]=tot;
}
void dfs(int x,int tep)
{
ans++;ans%=mo;//方案数加加
for(int i=head[x];i;i=edge[i].next)dfs(edge[i].to,tep+1);//下个人
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y;cin>>x>>y;
if(!q[x][y])
{
q[x][y]=1;
add(x,y);
}
}
for(int i=1;i<=n;i++)dfs(i,1);
cout<<ans;
return 0;
}