AD学习之旅(15)— 导入LOGO到PCB

线程池的异常处理

  返回  

论小模拟8

2021/7/20 15:09:10 浏览:

这次AK了,可是有4人AK,还是没有单独拿下第1,不过相比上次又进步了。

Good good study,day day up!

T1

2人比赛,每次给1人加分,如果1人达到11分&另1人<=9分,结束。如果另1人>9分,直到其中1人比另1人高2分,结束。结束时第1行输出2人比分,第2行输出胜者。

思路

每次给得分者加分,发现1人达到11分,判断另1人是否<=9分,是则结束,否则标记一下,下1次到两人之差==2时结束。

代码

#include<bits/stdc++.h>
using namespace std;
string s;
int t1,t2;
bool flag;
int main(){
	while(cin>>s){
		if(s[0]=='j')
			t2++;
		else
			t1++;
		if(!flag){
			if(t1==11){
				if(t2<=9){
					printf("%d:%d\nztz",t1,t2);
					return 0;
				}
				else
					flag=1;
			}
			if(t2==11){
				if(t1<=9){
					printf("%d:%d\njxq",t1,t2);	
					return 0;
				}
				else
					flag=1;
			}	
		}
		else{
			if(t1-t2==2){
				printf("%d:%d\nztz",t1,t2);	
				return 0;
			}
			if(t2-t1==2){
				printf("%d:%d\njxq",t1,t2);	
				return 0;
			}
		}
	}	
	return 0;
}

T2

给定n,输出n层数字三角形,数字按照1234567890的顺序反复输出。

思路

暴力枚举每行个数,数字大于9赋为0,挨着输出。

代码

#include<bits/stdc++.h>
using namespace std;
int n,num,i,j;
int main(){
	cin>>n;
	for(i=1;i<=n;i++){
		for(j=1;j<=i;j++){
            num++;
			printf("%d",num%10);
		}
		putchar('\n');
	}
	return 0;
}

T3

给定1个长度为n的序列,初始为0,有k个操作,每次读入l,r,将区间[l,r]的数+1,问最后的中位数是多少?

本题共2种解法。

1.差分,差分数组表示这个数-前1个数的结果,每次把差分数组位置l加1,因为l的位置和前1个数的差增加了1。由于中间都加1,所以不管,因为r+1的位置没有+1,所以和r的差缩小了,故把r+1的位置减1,最后对数组作前缀和,排序求中位数。

2.差分&树状数组,每次add(l,1),add(r+1,-1),每次加x&-x原理同上。然后求每个值的sum,每次减x&-x往下找,最后同上。

代码1 差分 时间复杂度 O(nlogn)(排序带log)。

#include<bits/stdc++.h>
using namespace std;
int n,k,l,r,sum[1000001];
int main(){
	int i;
	cin>>n>>k;
	for(i=1;i<=k;i++){
		scanf("%d%d",&l,&r);
		sum[l]++;
		sum[r+1]--;
	}
	for(i=1;i<=n;i++)
		sum[i]+=sum[i-1];
	sort(sum+1,sum+1+n);
	cout<<sum[n/2+1];
	return 0;
}

代码2 差分&树状数组 时间复杂度同上

#include<bits/stdc++.h>
using namespace std;
int n,k,l,r,sum[1000001],ans[1000001],j;
void add(int x,int v){
	int i;
	for(i=x;i<=n;i+=(i&-i))
		sum[i]+=v;
}
int Sum(int x){
	int s=0,i;
	for(i=x;i>0;i-=(i&-i))
		s+=sum[i];
	return s;
}
int main(){
	int i;
	cin>>n>>k;
	for(i=1;i<=k;i++){
		scanf("%d%d",&l,&r);
		add(l,1);
		add(r+1,-1);
	}
	for(i=1;i<=n;i++)
		ans[i]=Sum(i);
	sort(ans+1,ans+1+n);
	cout<<ans[n/2+1];
	return 0;
}

T4

给定1个长度为n的序列,给定每个值。从中至少删去几个数满足相邻两数|a[i]-a[i+1]|!=1

思路

LIS问题变形,只需要把条件改成abs(a[i]-a[j])!=1即可。

代码

#include<bits/stdc++.h>
using namespace std;
int n,c[1001],i,j,f[1001],ans;
int main(){
	cin>>n;
	for(i=1;i<=n;i++)
		cin>>c[i];
	for(i=1;i<=n;i++){
		for(j=i-1;j>=1;j--)
			if(abs(c[i]-c[j])!=1)
				f[i]=max(f[j],f[i]);
		f[i]++;
		ans=max(f[i],ans);
	}
	cout<<n-ans;
	return 0;
}

 T5

给定n个砝码,问可以称多少种重量的物体。

思路

f[i][j]i表示正负,0为负数,1为整数,j表示这个数是否能拼出来。正负情况分类讨论。

#include<bits/stdc++.h>
using namespace std;
int n,a[501],i,cnt,s,j,k;
bool f[2][2][20001]={},ans[20001];
int main(){
	cin>>n;
	for(i=1;i<=n;i++){
		cin>>a[i];
		s+=a[i];
	}
	f[1][0][0]=1;
	for(i=0;i<=1;i++)
		for(j=0;j<n;j++)
			for(k=0;k<=s;k++){
				if(f[i][j%2][k]){
					f[i][(j+1)%2][k]=1;
					f[i][(j+1)%2][k+a[j+1]]=1;
					if(i){
						if(a[j+1]>k)
							f[0][(j+1)%2][a[j+1]-k]=1;
						else
							f[1][(j+1)%2][k-a[j+1]]=1;
					}
					else{
						if(a[j+1]>=k)
							f[1][(j+1)%2][a[j+1]-k]=1;
						else
							f[0][(j+1)%2][k-a[j+1]]=1;
					}
				}
			}
	for(i=0;i<=1;i++)
		for(j=1;j<=s;j++)
			if(f[i][n%2][j])
				ans[j]=1;
	for(i=1;i<=s;i++)
		if(ans[i])
			cnt++;
	cout<<cnt;
	return 0;
}

end

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号