a.一元三次
看代码知解法
for(double i=-100.0000;i<=100.0000;i+=0.0001)
if(f(i)<=1e-3 && f(i)>=-1e-3){
printf("%.2lf ",i);
i+=1.0;
}
b.单词查找树
字典树
#include<bits/stdc++.h>
using namespace std;
int t,m,n;
char x[65];
struct tr {int s[30];}a[500000];
inline void in() {
int l=strlen(x),p=0;
for(int i=0;i<l;i++){
if(a[p].s[x[i]-'A']==0)
a[p].s[x[i]-'A']=++t;
p=a[p].s[x[i]-'A'];
}
}
int main() {
while(scanf("%s",x)!=EOF) in();
cout<<t+1<<endl;
return 0;
}
c.比例简化
由于L<100可以直接暴力枚举
#include<bits/stdc++.h>
using namespace std;
int a,b,l,A,B;
double num,ans;
int gcd(int x,int y){return y==0 ? x : gcd(y,x%y);}
int main(){
scanf("%d%d%d",&a,&b,&l);
num=1.0*a/b*1.0;
ans=1000000.0;
for(int i=1;i<=l;i++)
for(int j=1;j<=l;j++)
if(gcd(i,j)==1){
double s=i*1.0/j*1.0;
if(s>num){
if(s-num<ans){
A=i,B=j;
ans=s-num;
}
}
}
cout<<A<<" "<<B;
}
d.幸运数划分
1000以内的数据直接打表
e.最小花费
最短路板子,边权得进行小转化
#include<bits/stdc++.h>
using namespace std;
#define N 400010
int nxt[N],head[N],to[N],co[N],cnt;
double d[N];
bool v[N];
inline void add(int x,int y,int z){
to[++cnt]=y;
co[cnt]=100-z;
nxt[cnt]=head[x];
head[x]=cnt;
}
int n,m,a,b;
queue<int> q;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z),add(y,x,z);
}
for(int i=1;i<=n;i++)d[i]=9999999.0;
scanf("%d%d",&a,&b);
d[b]=100.0;
v[b]=1;
q.push(b);
while(q.size()){
int x=q.front();
q.pop();
v[x]=0;
for(int i=head[x];i;i=nxt[i]){
int y=to[i];double z=co[i]*1.0;
if(d[y]>((d[x]*100)/z)){
d[y]=(d[x]*100)/z;
if(!v[y]) q.push(y),v[y]=1;
}
}
}
printf("%.8lf",d[a]);
}
/*
3 3
1 2 1
2 3 2
1 3 3
1 3
*/
f.曹冲养猪
中国剩余定理板题
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll m[20],a[20],M[20],m0=1;
ll n,t[20],k[20];
void exgcd(ll a,ll b,ll &x,ll &y){
if(!b){x=1;y=0;return ;}
exgcd(b,a%b,x,y);
ll z=x;x=y;y=z-(a/b)*y;
return ;
}
unsigned ll x=0;
int main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++){scanf("%lld%lld",m+i,a+i);m0*=m[i];}
for(int i=1;i<=n;i++) {
M[i]=m0/m[i];
exgcd(M[i],m[i],t[i],k[i]);
t[i]=(t[i]%m[i]+m[i])%m[i];
x+=a[i]*M[i]*t[i];
x%=m0;
}
printf("%llu",x);
return 0;
}
/*
3
3 1
5 1
7 2
*/
g.保龄球
用一个v数组储存该轮记是三次的得分还是两次
num存该轮从哪一次滚球开始计分
a存每一次滚球的得分
注意第11次和第12ci要特判
#include<bits/stdc++.h>
using namespace std;
bool v[15];
int num[15];
int a[25],cnt;
char op[3];
void chuli(int i){
if(op[0]=='/'){
v[i]=1;
a[++cnt]=10;
num[i]=cnt;
} else {
a[++cnt]=op[0]-'0';
num[i]=cnt;
int x=10-a[cnt];
if(op[1]=='/'){
v[i]=1;
a[++cnt]=x;
}
else{
v[i]=0;
a[++cnt]=op[1]-'0';
}
}
}
int ans;
int main(){
for(int i=1;i<=10;i++){
scanf("%s",op);
chuli(i);
}
if(v[10]){
scanf("%s",op);
chuli(11);
if(a[num[10]]==10 && a[num[11]]==10){
scanf("%s",op);
chuli(12);
}
}
for(int i=1;i<=10;i++){
int j=num[i];
if(v[i]) ans+=a[j]+a[j+1]+a[j+2];
else ans+=a[j]+a[j+1];
}
cout<<ans;
}
/*
/ / / 72 9/ 81 8/ / 9/ / 8/
*/
h.关押罪犯
并查集板题
#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct node{
int a,b;
ll c;
}p[1000010];
inline bool operator < (node x,node y){return x.c>y.c;}
int fa[400040];
int get(int x){return fa[x]==x ? x : fa[x]=get(fa[x]);}
int n,m;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n*2+2;i++) fa[i]=i;
for(int i=1;i<=m;i++) scanf("%d%d%d",&p[i].a,&p[i].b,&p[i].c);
sort(p+1,p+m+1);
for(int i=1;i<=m;i++){
int x,y,k,h;
x=get(p[i].a),y=get(p[i].b);
k=get(p[i].a+n),h=get(p[i].b+n);
if(x==y){cout<<p[i].c;return 0;}
fa[h]=x,fa[k]=y;
}
cout<<0;
return 0;
}
/*
4 6
1 4 2534
2 3 3512
1 2 28351
1 3 6618
2 4 1805
3 4 12884
*/
i.暗黑游戏
可以通过2进制划分转化为01背包,但本题数据直接暴力枚举也可以过
#include<bits/stdc++.h>
using namespace std;
#define N 10000
int n,mp,mr,t;
int cp[N],cr[N],s[N],v[N];
int dp[101][101];
void chuli(int i){
if(!s[i]) s[i]=max(mp/cp[i],mr/cr[i]);
s[i]--;
if(!s[i]) return ;
int k=2;
while(s[i]>k){
t++;
cp[t]=cp[i]*k;
cr[t]=cr[i]*k;
v[t]=v[i]*k;
s[i]-=k;
k<<=1;
}
k=s[i];
t++;
cp[t]=cp[i]*k;
cr[t]=cr[i]*k;
v[t]=v[i]*k;
}
int main(){
scanf("%d%d%d",&n,&mp,&mr);
t=n;
for(int i=1;i<=n;i++) scanf("%d%d%d%d",cp+i,cr+i,s+i,v+i);
for(int i=1;i<=n;i++) chuli(i);
for(int i=1;i<=t;i++)
for(int j=mp;j>=cp[i];j--)
for(int k=mr;k>=cr[i];k--)
dp[j][k]=max(dp[j][k],dp[j-cp[i]][k-cr[i]]+v[i]);
cout<<dp[mp][mr];
}
/*
3 10 10
5 3 0 110
4 3 4 120
2 3 1 130
*/