首先理解题意,不是谁先吃完谁赢,而是谁先吃完,谁输。
然后就简单了,注意在 \(a=b\) 是要考虑谁是先手,先手必输。
//Don‘t act like a loser.
//This code is written by huayucaiji
//You can only use the code for studying or finding mistakes
//Or,you‘ll be punished by Sakyamuni!!!h>
#define int long long
using namespace std;
int read() {
char ch=getchar();
int f=1,x=0;
while(ch<‘0‘||ch>‘9‘) {
if(ch==‘-‘)
f=-1;
ch=getchar();
}
while(ch>=‘0‘&&ch<=‘9‘) {
x=x*10+ch-‘0‘;
ch=getchar();
}
return f*x;
}
int a,b,c;
signed main() {
cin>>a>>b>>c;
if(c==1) {
if(a>=b) {
printf("Takahashi\n");
}
else {
printf("Aoki\n");
}
}
else {
if(a>b) {
printf("Takahashi\n");
}
else {
printf("Aoki\n");
}
}
return 0;
}
这个题非常简单,对于每一组魔法,把 \(X_i,Y_i\) 和 \(S,D\) 做大小比较即可,注意两者只要有一种不满足条件魔法就失效。
//Don‘t act like a loser.
//This code is written by huayucaiji
//You can only use the code for studying or finding mistakes
//Or,you‘ll be punished by Sakyamuni!!!
#include<bits/stdc++.h>
#define int long long
using namespace std;
int read() {
char ch=getchar();
int f=1,x=0;
while(ch<‘0‘||ch>‘9‘) {
if(ch==‘-‘)
f=-1;
ch=getchar();
}
while(ch>=‘0‘&&ch<=‘9‘) {
x=x*10+ch-‘0‘;
ch=getchar();
}
return f*x;
}
const int maxn=1e3+10;
int n,x[maxn],y[maxn],s,d;
signed main() {
bool flag=0;
cin>>n>>s>>d;
for(int i=1;i<=n;i++) {
x[i]=read();
y[i]=read();
if(x[i]<s&&y[i]>d) {
cout<<"Yes\n";//有一组成功即可。
return 0;
}
}
cout<<"No\n";//都不成功输出 NO
return 0;
}
这个题一看 \(k\) 那么小,直接搜索即可,我们枚举第 \(i\) 个客人把球放在第 \(C_i\) 或者 \(D_i\) 个盘子上的时候满足的条件数,总共 \(2^k\) 种情况用搜索来枚举,最后写一个 calc
函数检查有多少条件被满足即可,取最大值。
时间复杂度 \(O(2^k\cdot m)\)。
//Don‘t act like a loser.
//This code is written by huayucaiji
//You can only use the code for studying or finding mistakes
//Or,you‘ll be punished by Sakyamuni!!!
//#pragma GCC optimize("Ofast","-funroll-loops","-fdelete-null-pointer-checks")
//#pragma GCC target("ssse3","sse3","sse2","sse","avx2","avx")
#include<bits/stdc++.h>
using namespace std;
int read() {
char ch=getchar();
int f=1,x=0;
while(ch<‘0‘||ch>‘9‘) {
if(ch==‘-‘)
f=-1;
ch=getchar();
}
while(ch>=‘0‘&&ch<=‘9‘) {
x=x*10+ch-‘0‘;
ch=getchar();
}
return f*x;
}
const int maxn=1e2+10;
int n,m,k,a[maxn],b[maxn],ans,c[maxn],d[maxn],hv[maxn];
//hv 记录第 i 个盘子上有多少个球
int calc() {
int ret=0;
for(int i=1;i<=m;i++) {
if(hv[a[i]]&&hv[b[i]]) {
ret++;//满足条件
}
}
return ret;
}
void dfs(int i) {
if(i==k+1) {
ans=max(ans,calc());
return ;
}
hv[c[i]]++;
dfs(i+1);
hv[c[i]]--;//别忘了回溯
hv[d[i]]++;
dfs(i+1);
hv[d[i]]--;
return ;
}
signed main() {
cin>>n>>m;
for(int i=1;i<=m;i++) {
a[i]=read();
b[i]=read();
}
cin>>k;
for(int i=1;i<=k;i++) {
c[i]=read();
d[i]=read();
}
dfs(1);
cout<<ans<<endl;
return 0;
}
这是一道数学题。
我们首先可以分析一下样例,对于 \(N=12\) 时,有 \(4\) 组解。
我们发现,第 \(3\),第 \(4\) 组解的后缀和第 \(2\),第 \(1\) 组解完全相同。因此我们可以得出以下结论:
如果对于整数 \(N\),有一组解 \([x,x+1,x+2,\cdots,x+k]\) 且 \(x>0\),那么一定还有一组解为 \([-(x-1),-(x-2),\cdots ,0,\cdots x-1,x,x+1\cdots,x+k]\),证明过于简单,这里不再赘述。
那么很明了了,我们只需要求出所有 \(x>0\) 的情况数即可,可是怎么求呢?
我们再从和为 \(N\) 这个条件出发想,如果有一组解有偶数个数,如:\([x-k,\cdots,x,x+1,\cdots,x+1+k]\),一定有 \((x+0.5)*(2k+2)=N\),同理,若有奇数个数,如 \([x-k,\cdots,x,\cdots,x+k]\),一定有 \(x*(2k+1)=N\)。证明略。
我们可以枚举某一组解的长度,确定 \(k\) 和 \(x\),当 \(x-k\leq 0\) 时,枚举结束即可。可以证明,若序列长度为 \(l\),且 \(x-k>0\),一定有 \(2*l^2\leq N\),证明略。
前面提到的证明非常基础,若不能证明,建议补补数学。
//Don‘t act like a loser.
//This code is written by huayucaiji
//You can only use the code for studying or finding mistakes
//Or,you‘ll be punished by Sakyamuni!!!
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,ans;
signed main() {
cin>>n;
for(int i=1;i*i<=2*n;i++) {
//这里可能和前面所说的变量名和判断方法不太一样
//希望读者自行理解
if(i&1&&n%i==0) {
ans++;
}
if(i%2==0&&(n*2)%i==0&&n%i!=0) {
ans++;
}
}
cout<<ans*2<<endl;
return 0;
}
记得开 long long
Atcoder ABC 190 赛后解题报告(暂A-D,后续会持续更新)
原文:https://www.cnblogs.com/huayucaiji/p/ABC190.html