ショッピング
すでに購入したゲームにマークを付けてから、最初のゲームから購入を開始します。それでも購入でき、マークが付いていない場合は、購入します。
#include<bits/stdc++.h>
using namespace std;
long long n,ans,num,x;
struct node
{
int id;
int tot;
}a[100010];
inline int read()
{
int f=1;
int res=0;char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-f;ch=getchar();}
while(isdigit(ch))res=(res<<1)+(res<<3)+(ch&15),ch=getchar();
return res*f;
}
map<int ,int >vis;
int main()
{
n=read();num=read();
for(int i=1;i<=n;i++)x=read(),vis[x]++;
x=0;
for(int i=1;i<=1e9;i++)if(!vis[i]&&i+x<=num){
ans++;x+=i;}//看看能买几个
else if(i+x>num)break;
cout<<ans<<endl;
x=0;
for(int i=1;i<=1e9;i++)if(!vis[i]&&i+x<=num){
cout<<i<<' ';x+=i;}买哪几个
else if(i+x>num)break;
return 0;
}
数学の問題
最初に長いdouble型の数値を使用し、nの半分の値を保存してから列挙型qのサイズを列挙し、次に2つの数値を使用してpを計算します。丸めと5オフの2つのケースがあります。 、答えを計算し、分かかります
#include<bits/stdc++.h>
using namespace std;
long long n,m,a1,a2;
long double nf;
double minn=1000000000.00;
double abss(double x)
{
if(x>0)return x;
return -x;
}
int main()
{
cin>>n>>m;
nf=pow(n,(long double )2.0/3);
for(int i=1;i<=m;i++)
{
//分四舍五入两种情况讨论
long long t1=i*nf;
long long t2=i*nf+1;
double t3=abss((double)((double)((((double)(t1))/((double)(i)))-nf)));
double t4=abss((double)((double)((((double)(t2))/((double)(i)))-nf)));
if(t3<minn)//找最小的答案
{
minn=t3;
a1=t1;
a2=i;
}
if(t4<minn)
{
minn=t4;
a1=t2;
a2=i;
}
}
cout<<a1<<'/'<<a2;
return 0;
}
出力の組み合わせの数
【出力フォーマット】
すべての組み合わせで、各組み合わせが1行、要素が小さいものから大きいものへと並べられ、各要素が3文字の位置を占めます。すべての組み合わせも辞書順になっています。
当たり障りのない、目立たない爆発的な検索、注意してください。出力するときは、3つのフィールド幅が必要です。
#include<bits/stdc++.h>
using namespace std;
int n,k;
inline int read()
{
int f=1;
int res=0;char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-f;ch=getchar();}
while(isdigit(ch))res=(res<<1)+(res<<3)+(ch&15),ch=getchar();
return res*f;
}
int ans[250],vis[250];
inline void pintf()
{
for(int i=1;i<=k;i++)cout<<setw(3)<<ans[i];//场宽
putchar('\n');
}
inline void dfs(int last,int x)
{
if(x==k)
{
pintf();
return;
}
for(int i=last+1;i<=n;i++)
{
if(!vis[i])
{
vis[i]=1;
ans[x+1]=i;
dfs(i,x+1);
vis[i]=0;//还原现场
}
}
}
int main()
{
n=read();k=read();
dfs(0,0);
return 0;
}
石を取る
SG機能
公平なゲームは次のように抽象化できます。DAGにチェスピースがあり、2人が交代で移動し、移動できない人が負けます。
SG関数の定義は次のとおりです。次数のないポイントのSG値は0であり、他のポイントのSG値は後続のSG値のmexです。つまり、SG(u)= mex {SG(v)}、u→vSG(u)= mex {SG(v)}、u→vです。
SG値が0のポイントでは、最初の手が敗北し、他のポイントでは、最初の手が勝つ必要があります。
データスケールが大きい場合、一般的に言えば、SG関数の一般的な用語はテーブルを入力することで見つけることができます。
それ以外の場合は再帰的に計算できます。Trieツリーでジャンプメソッドを使用するようにmexに依頼します。
SG関数
はmex {S}操作を定義します:セットSにない最小の非負の整数。
例:mex {0,2,3,4} = 1、mex {1,2,3,4} = 0。
任意の状態x、SG(x)= mex {S} SG(x)= mex {S}の場合、Sはxの後続の状態のSG関数値のセットです。
xの次の3つのSG関数値がSG(a)、SG(b)、SG©SG(a)、SG(b)、SG©の場合、SG(x)= mex {SG(a)、SG( b)、SG©} SG(x)= mex {SG(a)、SG(b)、SG©}。
xが最終状態の場合、後続の状態は空であり、SG(x)= 0 SG(x)= 0、つまり障害の状態です。
n個の石が山積みになっていて、一度に取ることができるのは{1、3、4}個の石だけです。最初に石を取っている人が勝ちます。
次に、各番号のSG値はいくつですか。
1
2
SG(0)= 0、f [] = {1,3,4}
x = 1、1つを選択でき、残りは0、SG(1)= mex {SG(0)} = 1です。
x = 2の場合、1つを選択でき、残りの1つはSG(2)= mex {SG(1)} = 0です。
x = 3の場合、1または3を取り、残りの2または0をとることができます。SG(3)= mex {SG(2)、SG(0)} = 1。
x = 4の場合、1、3、4になり、残りの3、1、0、SG(4)= mex {SG(3)、SG(1)、SG(0)} = 2になります。
SG関数は小さいものから大きいものへと推定できることがわかります。
上記の例から、SG関数値の解決手順を取得できます。1からnまでのSG関数値を計算する手順は次のとおりです。
配列fを使用して、現在の状態をどのように変更できるかを記録します。
次に、別の配列を使用して、現在の状態xの後続の状態をマークします。
最後に、mex操作をシミュレートします。つまり、マークされた値でマークされていない値の最小値を検索し、それをSG(x)に割り当てます。
手順2〜3を繰り返し、1〜nの関数値の計算を完了しました。
ゲームは2つのサブゲームa、bに分解でき、その後の状態はSG [a] ^ SG [b]の値になります。
#include<bits/stdc++.h>
using namespace std;
long long n,m,x;
long long ans;
int vis[2];
inline int mex(int x,int y)
{
vis[0]=vis[1]=vis[2]=0;
vis[x]=1;vis[y]=1;
for(int i=0;i<=2;i++)
if(!vis[i])return i;
}
inline int read()
{
int res=0;char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))res=(res<<1)+(res<<3)+(ch&15),ch=getchar();
return res;
}
inline int sg(int x)
{
if(x==0)return 0;
if(x%2)
{
if(x<=3)return mex(sg(x-1),2);
else return 0;
}
else return mex(sg(x-1),sg(x/2));
}
int main()
{
int t;t=read();
while(t--)
{
ans=0;
n=read();m=read();
for(int i=1;i<=n;i++)
{
x=read();
if(!(m%2)&&x>2)ans^= !(x%2);//偶数情况 如果 k>1也就是 x>2情况下 偶数堆 0 奇数堆 1
else if(!(m%2)&&x<=2)ans^=x;//偶数情况 如果 k<=1也就是x<=2情况是 输出堆数
else ans^=sg(x);//奇数情况
}
if(ans)cout<<"YJC"<<endl;
else cout<<"CJY"<<endl;
}
return 0;
}