Codeforces Round #693 (Div. 3)
A. Cards for Friends
按照题目递归模拟即可
int f(int a,int b)
{
if(a%2 && b%2) return 1;
if(a%2==0) return 2*f(a/2,b);
else return 2*f(a,b/2);
}
int main()
{
int t;
cin >> t;
while(t--)
{
int w,h,n;
cin >> w >> h >> n;
int ans=1;
ans=f(w,h);
if(ans>=n) cout << "YES" << endl;
else cout << "NO" << endl;
}
}
B. Fair Division
int a[maxn];
int main()
{
int t;
cin >> t;
while(t--)
{
int n;
cin >> n;
int sum=0,odd=0,even=0;
for(int i=1;i<=n;i++)
{
cin >> a[i];
sum+=a[i];
if(a[i]%2) odd++;
else even++;
}
if(sum%2)
{
cout << "No" << endl;
continue;
}
sum/=2;
if(sum%2==0)
{
cout << "YES" << endl;
continue;
}
if(odd) cout << "YES" << endl;
else cout << "NO" << endl;
}
}
C. Long Jumps
记忆化搜索
int n;
ll a[maxn],dp[maxn];
map<int,int> book;
ll dfs(int pos)
{
if(pos>n) return 0;
if(dp[pos]) return dp[pos];
book[pos]=1;
return dp[pos]=(a[pos]+dfs(pos+a[pos]));
}
int main()
{
int t;
cin >> t;
while(t--)
{
book.clear();
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
dp[i]=0;
}
ll maxx=-1;
for(int i=1;i<=n;i++)
{
if(!book[i]) maxx=max(maxx,dfs(i));
}
printf("%lld\n",maxx);
}
}
D. Even-Odd Game
贪心,从大到小互选
ll a[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int odd=0;
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
sort(a+1,a+1+n);
ll ALi=0,Bob=0;
int flag=1;
for(int i=n;i>=1;i--)
{
if(flag==1)
{
if(a[i]%2==0) ALi+=a[i];
}
else {
if(a[i]%2) Bob+=a[i];
}
flag*=-1;
}
if(ALi==Bob) printf("Tie\n");
else if(ALi>Bob) printf("Alice\n");
else printf("Bob\n");
}
}
E. Correct Placement
取前大后小,排序后只需看后小值就行,维护最小前缀数组加以判断即可。
struct Node
{
int maxx,minn,pos;
}node[maxn];
bool cmp(Node a,Node b)
{
return a.maxx<b.maxx;
}
int ans[maxn],minn[maxn],num[maxn];
int main()
{
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
for(int i=1;i<=n;i++)
{
int t1,t2;
scanf("%d%d",&t1,&t2);
node[i].maxx = max(t1,t2);
node[i].minn = min(t1,t2);
node[i].pos = i;
}
sort(node+1, node+1+n, cmp);
minn[1]=node[1].minn;
num[1]=node[1].pos;
for(int i=2;i<=n;i++)
{
if(node[i].minn<minn[i-1])
{
minn[i] = node[i].minn;
num[i] = node[i].pos;
}
else {
minn[i] = minn[i-1];
num[i] = num[i-1];
}
}
int minnt = inf,numt=0;
for(int i=1;i<=n;i++)
{
if(node[i].maxx==node[1].maxx) { ans[node[i].pos]=-1; continue;}
if(node[i].maxx!=node[i-1].maxx && i!=1)
{
if(minnt>minn[i-1])
{
minnt = minn[i-1];
numt = num[i-1];
}
}
if(minnt<node[i].minn) { ans[node[i].pos] = numt; }
else ans[node[i].pos]=-1;
}
for(int i=1;i<=n;i++) printf("%d ",ans[i]);
printf("\n");
}
}