- 阳子墨 的博客
国庆集训 DAY3
- @ 2024-10-4 16:44:14
T1减法和求余
错因 :没开(long long (╬▔皿▔)╯)
思路
如果是减法 可根据样例得知 是所有数-2*最小的数
如果是求模 可根据余数小于除数得知 是最小的数
正确代码
#include<bits/stdc++.h>
using namespace std;
int a[100010];
int main()
{
freopen("divmod.in","r",stdin);
freopen("divmod.out","w",stdout);
long long n,k,sum=0;
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
if(k==1)
{
if(n==1) cout<<a[n];
else if(n==2) cout<<a[2]-a[1];
else
{
sum=abs(a[1]-a[2]);
for(int i=3;i<=n;i++) sum+=a[i];
cout<<sum;
}
}
else cout<<a[1];
return 0;
}
T2回文串
错因 :无 q(≧▽≦q)
思路
先找到不是回文的地方
如果只有一处
将这里和对应的位置改成'a' 有几个不是'a'的修改次数减几
如果有两处
将每一处和对应的位置改成其中字典序小的 修改次数-2
如果没有
将不是'a' 最靠前的位置·改成‘ 'a' 修改次数-2
如果还有修改次数 将最中间的改为'a'
正确代码
#include<bits/stdc++.h>
using namespace std;
int b[3],idx;
int main()
{
freopen("hw.in","r",stdin);
freopen("hw.out","w",stdout);
int k,cnt=2,z;
string s;
cin>>s;
if(s.size()%2==1) k=s.size()/2;
else k=s.size()/2-1;
for(int i=0;i<=k;i++)
{
if(s[i]!=s[s.size()-i-1])
{
b[++idx]=i;
}
}
if(idx==1)
{
z=b[1];
if(s[z]!='a') cnt--;
if(s[s.size()-z-1]!='a') cnt--;
s[z]='a';
s[s.size()-z-1]='a';
}
else if(idx==2)
{
for(int j=1;j<=idx;j++)
{
z=b[j];
if(s[z]<s[s.size()-z-1]) s[s.size()-z-1]=s[z];
else s[z]=s[s.size()-z-1];
cnt--;
}
}
else
{
z=0;
if(s[z]!='a') cnt--;
if(s[s.size()-z-1]!='a') cnt--;
s[z]='a';
s[s.size()-z-1]='a';
}
if((cnt==1||cnt==2)&&s.size()%2==1) s[k]='a';
cout<<s;
return 0;
}
T3涂色仪式
思路
相邻的节点只要是质数,答案就++
用埃氏筛法
正确代码
#include<bits/stdc++.h>
using namespace std;
int pr[150000],idx,flag[2000000],a[300010];
void init()
{
for(int i=2;i<=2000000;i++)
{
if(!flag[i])
{
pr[++idx]=i;
for(int j=i*2;j<=2000000;j+=i) flag[j]=1;
}
}
return ;
}
int main()
{
freopen("color.in","r",stdin);
freopen("color.out","w",stdout);
init();
int n,cnt=0;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n-1;i++)
{
int u,t;
cin>>u>>t;
if(!flag[a[u]+a[t]]) cnt++;
}
cout<<cnt;
return 0;
}
T4除法来咯
思路
我们可以枚举商 商一定可以取到5
如果他比1e6*商还大肯定不可以
a[i]/j是除数
a[i]%j是余数
除数必须大于余数
所以如果(a[i]/j)<=(a[i]%j) 肯定也不可以
正确代码
#include<bits/stdc++.h>
using namespace std;
int a[100010],f[6];
int main()
{
freopen("div.in","r",stdin);
freopen("div.out","w",stdout);
int n,maxx=0,cnt=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
for(int j=1;j<=5;j++)
{
int t=a[i]/1000000;
if((a[i]/j)>(a[i]%j)&&t<=j) f[j]++;
}
}
for(int i=1;i<=5;i++) maxx=max(maxx,f[i]);
cout<<maxx;
return 0;
}