AGC003做题记录
打VP的时候只会A,B,C,连D这种傻逼题都不会,智熄了
要求走出去之后能走回来,那么只需满足有东就有西,有南就有北即可
点击查看代码
#include<bits/stdc++.h>
using namespace std;
string s;
bool s1,s2,s3,s4;
int main(){
cin>>s;
for(int i=0;i<(int)s.size();i++)
if(s[i]=='W')s1=1;
else if(s[i]=='E')s2=1;
else if(s[i]=='N')s3=1;
else if(s[i]=='S')s4=1;
if(s1!=s2||s3!=s4)cout<<"No"<<endl;
else cout<<"Yes"<<endl;
return 0;
}
贪心,每个位置尽量和上一个剩余的配对,配对不了自己配对
点击查看代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+11;
int n;
ll s[N],ans;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>s[i];
ans+=min(s[i-1],s[i]);
s[i]-=min(s[i-1],s[i]);
ans+=s[i]/2;
s[i]%=2;
}
cout<<ans<<endl;
return 0;
}
发现三个数逆序就是奇数位/偶数位随便互换,所以只要把排名与初始位置奇偶性不相同的数两两互换即可
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int cnt,n,a[100011],b[100011];
map<int,int>mp;
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i],b[i]=a[i];
sort(b+1,b+n+1);
for(int i=1;i<=n;i++)mp[b[i]]=i;
for(int i=1;i<=n;i++){
a[i]=mp[a[i]];
if(i%2==1&&a[i]%2==0)cnt++;
}
cout<<cnt<<endl;
return 0;
}
先把每个数的质因子次幂mod 3,然后要使两个数相乘会等于完全立方数就需要每个质因子次幂之和都是3
容易发现每个数只会和一个数相乘得到完全立方数,并且该关系是相互的,于是只要在两个数中取更多的即可
注意1只能取1个,赋值一下就行了
点击查看代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+11;
int n,ans,tot;
ll a[N],b[N];
map<ll,int>cnt,vis;
int main(){
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
for(ll j=2;j*j*j<=a[i];j++)
while(a[i]%(j*j*j)==0)a[i]/=(j*j*j);
cnt[a[i]]++;
if(cnt[a[i]]==1)b[++tot]=a[i];
}
if(cnt[1])cnt[1]=1;
for(int i=1;i<=tot;i++){
if(vis[b[i]])continue;
ll els=1,now=b[i];
for(ll j=2;j*j*j<=b[i];j++)
if(now%j==0){
if(now%(j*j)==0)els*=j;
else els*=j*j;
while(now%j==0)now/=j;
}
ll s=sqrt(now);
if(s*s==now)els*=s;
else els*=now*now;
ans+=max(cnt[b[i]],cnt[els]);
vis[b[i]]=vis[els]=1;
}
cout<<ans<<endl;
return 0;
}