A
签到把可以除二的除到底
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long ll;
#define int long long
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
void slove(){
int n;
cin>>n;
vector<int>a(n,0);
int ans=0;
for(int i=0;i<n;i++){
cin>>a[i];
while(a[i]%2==0&&a[i]>0){
a[i]/=2;
}
ans+=a[i];
}
cout<<ans;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T=1;
// cin>>T;
while(T--){
slove();
}
return 0;
}
B
一开始看这题的时候以为是要推出一个公式,但是想了后面发现答案只可能在[k,2*k-1)之间,二分去找最大的就可以了
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long ll;
#define int long long
void slove(){
int n;
cin>>n;
if(n<=6){
int ans=0;
switch (n) {
case 1:
ans=1;
break;
case 2:
ans=-1;
break;
case 3:
ans=2;
break;
case 4:
ans=2;
break;
case 5:
ans=3;
break;
default:
ans=4;
break;
}
cout<<ans<<endl;
return;
}
int k=(n+1)/2;
int l=k,r=2*k-1;
while(l<r){
int mid=l+r+1>>1;
if(mid+(mid-k)*2<=n)l=mid;
else r=mid-1;
}
cout<<l<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T=1;
cin>>T;
while(T--){
slove();
}
return 0;
}
C
赛时用全排列把13以内的可行解求出来之后就可以发现 以3 5开头排列中最后一个是有规律的。但是赛后看题解发现,可以直接使用搜索每次找 i + {-3,-2,2,3}加一个找到就结束的剪枝就可以过
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long ll;
void slove(int n){
// int n;
// cin>>n;
if(n<=3||n==7){
cout<<"-1\n";
return;
}
if(n==5){
cout<<"3 4 5 1 2\n";
return;
}
vector<int>a(n,0);
if(n%2){
a[0]=3;
a[n-1]=n-2;
a[n-2]=n-3;
a[n-3]=n-5;
a[n-4]=n;
a[n-5]=n-1;
for(int i=2;i<n-5;i+=2)a[i]=max(i-2,1);
a[n-6]=n-7;
for(int i=n-8;i>0;i-=2)a[i]=min(i+4,n-4);
}
else {
a[0]=3;
for(int i=2;i<n;i+=2)a[i]=max(i-2,1);
a[n-1]=n-2;
for(int i=n-3;i>0;i-=2)a[i]=min(i+4,n);
}
for(int i=0;i<n;i++){
int k=abs(a[i]-i-1);
if(k<2||k>3){
cout<<endl;
cout<<endl;
cout<<"not of "<<n<<" : ";
cout<<endl;
cout<<endl;
return;
}
}
for(auto x:a)cout<<x<<" ";
cout<<endl;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
for(int i=1;)
return 0;
}
D
自己模拟了一遍2~7然后觉得是判断奇偶
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long ll;
#define int long long
void slove(){
int n;
cin>>n;
cout<<(n%2==0?"kou":"yukari");
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T=1;
while(T--){
slove();
}
return 0;
}
E
等腰直角三角形ABC,可以得出AB中点D到A,B,C的距离相等并且∠CDA=90°,通过中点去找C判断是否为整数点。
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long ll;
#define int long long
int dc(int xa,int ya,int xb,int yb){
return xa*ya+xb*yb;
}
void slove(){
double xa,xb,ya,yb;
cin>>xa>>ya>>xb>>yb;
double x=xa,y=ya;
double xx=(xb-xa)/2.0,yy=(yb-ya)/2.0;
x+=xx,y+=yy;
x-=yy,y+=xx;
int ansx=round(x),ansy=round(y);
if(abs(x-ansx)>1e-6||abs(y-ansy)>1e-6){
cout<<"No Answer!\n";
return;
}
if(dc(ansx-xa,ansy-ya,ansx-xb,ansy-yb)==0){
cout<<ansx<<" "<<ansy<<endl;
return;
}
cout<<"No Answer!\n";
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T=1;
// cin>>T;
while(T--){
slove();
}
return 0;
}
F
签到
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long ll;
void slove(){
string s;
cin>>s;
cout<<42;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T=1;
// cin>>T;
while(T--){
slove();
}
return 0;
}
G
因为不确定的运算符只有12个3种,最多就只有3^12次方,所以直接暴力去求出每种情况。题目给出的数字可能很大所以快速幂的时候底数要先在取模避免爆long long
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long ll;
#define int long long
int ed=0,n=1;
int qmi(int a, int k, int p) // 求a^k mod p
{
int res = 1 % p;
while (k)
{
if (k & 1) res = (ll)res * a % p;
a = (ll)a * a % p;
k >>= 1;
}
return res%p;
}//逆元qmi(n!,p-2,p)
vector<char>ans;
vector<int>a;
void dfs(int i,int s){
if(i==n){
if(s==ed){
cout<<a[0];
for(int i=1;i<=n;i++)cout<<ans[i]<<a[i];
exit(0);
// cout<<endl;
}
return;
}
ans[i]='+';
dfs(i+1,s+a[i]);
ans[i]='-';
dfs(i+1,s-a[i]);
if(s<=0)return;
ans[i]='#';
dfs(i+1,qmi(s%a[i],s,a[i]));
}
void slove(){
string s;
cin>>s;
int x=0;
ans.push_back('?');
for(auto t:s){
if(t=='?'||t=='='){
ans.push_back(t);
a.push_back(x);
x=0;
}
else x=x*10+t-'0';
}
ed=x;
n=a.size();
a.push_back(x);
dfs(1,a[0]);
cout<<"-1";
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T=1;
// cin>>T;
while(T--){
slove();
}
return 0;
}
后面将I和k补上