ACM-NEFU15屆校賽-大一組
阿新 • • 發佈:2020-12-15
A. 三角形面積
#include <bits/stdc++.h>
using namespace std;
int main()
{
double a,b,c;
double ans,p,tmp;
cin>>a>>b>>c;
p=(a+b+c)*0.5;
tmp=p*(p-a)*(p-b)*(p-c);
ans=sqrt(tmp);
printf("%.1lf", ans);
return 0;
}
B. 最大質因子
唯一分解定理
唯一分解定理又稱為算數基本定理,基本內容是:
每個大於1的自然數,要麼本身就是質數,要麼可以寫為2個或以上的質數的積,而且這些質因子按大小排列之後,寫法僅有一種方式。
用另一種方法表示就是:
對於任何一個大於1的正整數,都存在一個標準的分解式: N=p1^a1 * p2a2*···*pnan;(其中一系列an為指數,pn為質數)
此定理表明:任何一個大於 1 的正整數都可以表示為素數的積。
然而這道題純暴力就可解...
#include <bits/stdc++.h> using namespace std; const int maxn=1e5+10; bool judge(int a) { int flag=1; for (int i=2;i*2<=a;i++) if (a%i==0) {flag=0; break; } if (a==1) return 0; else return flag; } int main() { int a; while(cin>>a) { for (int i=a;i>=1;i--) { if (a%i==0) if (judge(i)) { cout<<i<<endl; break; } } } return 0; }
C.楊輝三角
模板例題
#include<bits/stdc++.h> using namespace std; int a[21][21]; int main() { memset(a, 0, sizeof(a)); a[1][1]=1; a[2][1]=a[2][2]=1; int n; cin>>n; for(int i=3;i<=n;i++)//行 { for(int j=1;j<=i;j++) { if(j==1 || j==i) { a[i][j]=1;continue; } a[i][j]=a[i-1][j-1]+a[i-1][j]; } } for(int i=1;i<=n;i++) { for(int j=1;j<=i;j++) { cout<<a[i][j]<<" "; } cout<<endl; } return 0; }
D."nefu"的數目
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
string s;
int scount(int p)
{
int sum=0;
int len=s.length();
for(int i=p+1;i<len;i++)
{
if(s[i]=='e')
{
for(int j=i+1;j<len;j++)
{
if(s[j]=='f')
{
for(int k=j+1;k<len;k++)
{
if(s[k]=='u') sum++;
//cout<<sum<<endl;
}
}
}
}
}
return sum;
}
int main()
{
int ans=0,flag=0;
cin>>s;
int len=s.length();
//cout<<len;
for(int i=0;i<len;i++)
{
if(s[i]=='n')
{
ans+=scount(i);
}
//cout<<ans<<endl;
}
cout<<ans<<endl;
return 0;
}
E. 最少修改次數(1)
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int main()
{
string s,t;
while(cin>>s)
{
cin>>t;
int ct=0;
int nums=s.size(),numt=t.size();
int min=1111;
for (int i=0;i<=nums-numt;i++)
{
int j=0;
ct=0;
for (int k=i;k<=i+numt-1;k++)
{
if (s[k]!=t[j]) ct++;
j++;
}
if (ct<min) min=ct;
}
cout<<min<<endl;
}
return 0;
}
F.字典序
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int main()
{
int n;
while(cin>>n)
{
string s1,s,max="0";
for (int i=1;i<=n;i++)
{
int m=i;
s.clear(); s1.clear();
while(m!=0)
{
s+=m%8+'0';
m/=8;
}
for (int j=s.size()-1;j>=0;j--)
{
s1+=s[j];
}
if (s1>max) max=s1;
}
cout<<max<<endl;
}
return 0;
}
G.最小差值
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int a[maxn];
int main()
{
int n,tot=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
tot+=a[i];
}
long long sum=0,ans=999999;
for(int i=0;i<n;i++)
{
long long com;
sum+=a[i];
com=tot-sum;
ans=min(ans, abs(com-sum));
}
cout<<ans;
return 0;
}
H.染色方案(待補)
I.最大正方形
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a[1000+5];
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1, a+1+n);
int ans=0;
for(int i=n;i>=1;i--)
{
if(a[i]>=ans+1)
{
ans++;
}
else break;
}
cout<<ans;
return 0;
}
J.最大值
注意:此題用C++輸入輸出會超時
#include<iostream>
#include<cstdio>
using namespace std;
const int MAXN=2e5+10;
int a[MAXN];
int times=0;
int main()
{
int n;
while(cin>>n)
{
int maxn=0,next=0;
for(int i=0;i<n;i++)
{
scanf("%d", &a[i]);
maxn=max(maxn, a[i]);
}
for(int i=0;i<n;i++)
{
if(a[i]==maxn)
{
times++;
continue;
}
next=max(next, a[i]);
}
for(int i=0;i<n;i++)
{
if(a[i]>=maxn && times<=1)
{
printf("%d\n", next);
}
else
{
printf("%d\n", maxn);
}
}
}
return 0;
}