9.3上午

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

*/ 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值