A
简单模拟。
#include<bits/stdc++.h>
#define endl '\n'
#define pii pair<int,int>
using namespace std;
void solve()
{
int x;
for(int i=1;i<=5;i++)
{
cin>>x;
if(x==1) cout<<i<<endl;
}
return ;
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T; T=1;
while(T--) solve();
return 0;
}
B
枚举每条边看是不是相同颜色,如果相同答案就+1。
#include<bits/stdc++.h>
#define endl '\n'
#define pii pair<int,int>
using namespace std;
const int maxn = 1e5+3;
vector<pii> p;
int in[maxn];
void solve()
{
int n; cin>>n;
string s; cin>>s;
s=' '+s;
for(int i=1;i<n;i++)
{
int u,v;
cin>>u>>v;
p.push_back({u,v});
}
int cnt=0;
for(int i=0;i<p.size();i++)
{
if(s[p[i].first]==s[p[i].second])
cnt++;
}
cout<<cnt<<endl;
return ;
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T; T=1;
while(T--) solve();
return 0;
}
C
n > 2 n>2 n>2 时,一定可以分为 n n n 进制和 n − 1 n-1 n−1 进制,特判 n = 1 n=1 n=1 和 n = 2 n=2 n=2 的情况。
#include<bits/stdc++.h>
#define endl '\n'
#define pii pair<int,int>
#define int long long
using namespace std;
void solve()
{
int n;
cin>>n;
if(n>2)
{
cout<<"YES"<<endl;
cout<<n-1<<" "<<n<<endl;
}
else if(n==1)
{
cout<<"YES"<<endl;
cout<<2<<" "<<3<<endl;
}
else cout<<"NO"<<endl;
return ;
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T; T=1;
while(T--) solve();
return 0;
}
D
找出在直线上方、直线下方和直线上的点,先让上下互联,再用直线上的点去连上面的和下面的,最后让同一组的互相连接。用栈来存储。
#include<bits/stdc++.h>
#define endl '\n'
#define pii pair<int,int>
#define int long long
using namespace std;
stack<int> aa,bb,cc;
int cal(int &x,int &y)
{
int t=min(x,y);
x-=t,y-=t;
return t;
}
void solve()
{
int n,k,b; cin>>n>>k>>b;
for(int i=1;i<=2*n;i++)
{
int x,y; cin>>x>>y;
if(k*x+b>y) bb.push(i); // 下方的
else if(k*x+b<y) aa.push(i); // 上方的
else cc.push(i); // 直线上的
}
int cnt1=aa.size(),cnt2=bb.size(),cnt3=cc.size();
int cnt=0;
cnt+=cal(cnt1,cnt2); // 上下连
cnt+=cal(cnt1,cnt3); // 上和直线连
cnt+=cal(cnt2,cnt3); // 下和直线连
cnt+=cnt3/2;
cout<<cnt<<endl;
// 上下连
while(!aa.empty()&&!bb.empty())
{
int t1=aa.top(),t2=bb.top();
aa.pop(),bb.pop();
cout<<t1<<" "<<t2<<" "<<'Y'<<endl;
}
// 上和直线连
while(!aa.empty()&&!cc.empty())
{
int t1=aa.top(),t2=cc.top();
aa.pop(),cc.pop();
cout<<t1<<" "<<t2<<" "<<'Y'<<endl;
}
// 下和直线连
while(!bb.empty()&&!cc.empty())
{
int t1=bb.top(),t2=cc.top();
bb.pop(),cc.pop();
cout<<t1<<" "<<t2<<" "<<'Y'<<endl;
}
// 直线上的点互相连
while(!cc.empty())
{
int t1=cc.top();
cc.pop();
int t2=cc.top();
cc.pop();
cout<<t1<<" "<<t2<<" "<<'Y'<<endl;
}
// 上面的点互相连
while(!aa.empty())
{
int t1=aa.top();
aa.pop();
int t2=aa.top();
aa.pop();
cout<<t1<<" "<<t2<<" "<<'N'<<endl;
}
// 下面的点互相连
while(!bb.empty())
{
int t1=bb.top();
bb.pop();
int t2=bb.top();
bb.pop();
cout<<t1<<" "<<t2<<" "<<'N'<<endl;
}
return ;
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T; T=1;
while(T--) solve();
return 0;
}
E
由于 k 1 < k 2 k1<k2 k1<k2,根据 k 2 k2 k2 的范围以及答案的范围,可以先枚举出来所有在答案范围内的只有一位是1的 k 2 k2 k2 进制的数,复杂度为 l o g k 2 ( 1 0 18 ) log_{k2}(10^{18}) logk2(1018),再对这些数进行子集枚举,组合出所有可能的 k 2 k2 k2 进制的数,复杂度为 2 l o g k 2 ( 1 0 18 ) 2^{log_{k2}(10^{18})} 2logk2(1018)
#include<bits/stdc++.h>
#define endl '\n'
#define pii pair<int,int>
#define int long long
using namespace std;
int k1,k2;
vector<int> q;
int N=1e18; // 上界
// 判断 x 是不是 K1进制的数
bool check(int x)
{
if(x<2) return false;
while(x)
{
if(x%k1>1) return false;
x/=k1;
}
return true;
}
void dfs(int x,int i)
{
if(x>N) return ;
if(check(x))
{
cout<<"YES\n"<<x<<endl;
exit(0);
}
if(i==q.size()) return ;
dfs(x,i+1);
dfs(x+q[i],i+1);
}
void solve()
{
cin>>k1>>k2;
q.push_back(1);
while(q.back()*k2<=N)
{
q.push_back(q.back()*k2);
}
dfs(0,0);
cout<<"NO"<<endl;
return ;
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T; T=1;
while(T--) solve();
return 0;
}