2020-05-18 — 习题训练一

A - Phoenix and Balance

找规律的题,a[i]=a[i-1]*2+2;

代码:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<math.h>
#include<map>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
	int n,m;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>m;
		m=m/2;
		long long ans=0;
		for(int j=0;j<m;j++){
			ans = ans*2+2;
		}
		cout<<ans<<endl;
	}
	return 0;
}

B - Phoenix and Beauty

我们把所有数字塞到一个set里面,看看set的size是否小于k,也就是说看看不同的数的个数是否小于k,如果不,那就cout<<-1;即可。剩下的思路就是我们把那些不同的数字(就是塞到set里面的数字)复制n遍,然后要是这些数字不足k个我们就随便输出一些数字。

代码:

#include<bits/stdc++.h>
using namespace std;
set<int>::iterator it;
int a[10005];
int read() {
    int ans=0,flag=1;
    char ch=getchar();
    while( (ch>'9' || ch<'0') && ch!='-' ) ch=getchar();
    if(ch=='-') flag=-1,ch=getchar();
    while(ch>='0' && ch<='9') ans=ans*10+ch-'0',ch=getchar();
    return ans*flag;
}
set<int> S;
int main(){
	int t,n,k;
	cin>>t;
	while(t--){
		cin>>n>>k;
		for(int i=1;i<=n;i++) {
			int q;
			scanf("%d",&q);
			S.insert(q);
		}
		if(S.size()>k) 
			cout<<-1<<endl;
		else {
			cout<<n*k<<endl;
			for(int i=1;i<=n;i++) {
				for(it=S.begin();it!=S.end();++it) printf("%d ",*it);
				for(int j=1;j<=k-S.size();j++) printf("1 ");
			}
			cout<<endl;
		}
		S.clear();
	}
	return 0;
}

这个题是看的题解,用循环节来做确实简单,自己的方法太复杂了,而且不容易做对。

代码(wa:case2):

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<math.h>
#include<map>
#include<set>
#include<iostream>
#include<algorithm>
using namespace std;
int a[10005];
int read() {
    int ans=0,flag=1;
    char ch=getchar();
    while( (ch>'9' || ch<'0') && ch!='-' ) ch=getchar();
    if(ch=='-') flag=-1,ch=getchar();
    while(ch>='0' && ch<='9') ans=ans*10+ch-'0',ch=getchar();
    return ans*flag;
}
set<int> S;
int main(){
	int b,c,d,t,n,k;
	cin>>t;
	while(t--){
		cin>>n>>k;
		memset(a,0,sizeof(a));
		for(int i=0;i<n;i++){
			a[i]=read();
			S.insert(a[i]);
		}
		if(S.size()>k)
			cout<<-1<<endl;	
		if(n==k){
			cout<<n+1<<endl;
			for(int i=0;i<n;i++)
				cout<<a[i]<<" ";
			cout<<a[0]<<endl;
		}
		else{
			for(int i=0;i+k<n&&n<10000;i++){
				if(a[i+k]==a[i]){
					continue;
				}
				else{
					for(int j=n-1;j>=i+k;j--){
						a[j+1]=a[j];
					}
					n++;
					a[i+k]=a[i];
				}
			}
			if(n>=10000){
				continue;
			}
			else{
				cout<<n<<endl;
				for(int j=0;j<n-1;j++){
					cout<<a[j]<<" ";
				}
				cout<<a[n-1]<<endl;
			}
		}
		S.clear();
	}
	return 0;
}

C - Road To Zero

分情况讨论就行了,在类型的强制转换上wa了3发。

代码:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<math.h>
#include<map>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
	int n,m;
	long long x,y,a,b;
	long long ans=0;
	cin>>n;
	for(int i=0;i<n;i++){
		ans=0;
		cin>>x>>y;
		cin>>a>>b;
		if(b>a*2){
			ans=(long long)(x+y)*a;
		}
		else{
			ans=(long long)min(x,y)*b;
			ans+=((long long)abs(x-y)*a); 
		}
		cout<<ans<<endl;
	}
	return 0;
}

D - Binary Period

分两种情况:第一种是循环节是1的,这样直接输出就行了,第二种是循环节是2的,这种要么是01,要么是10;

代码:

	#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<math.h>
#include<map>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
	int t,c=1;
	char s[1024];
	scanf("%d ",&t);
	while(t--){
		c=1;
		scanf("%s",&s);
		for (int i=0;i<strlen(s)-1;i++){
			if(s[i]!=s[i+1]){
				c=0;
				break;
			}
		}
		if(c==1){
			printf("%s\n",s);
		}
		else{
			for(int i=0;i<strlen(s);i++) {
				printf("10");
			}
			printf("\n");
		}
	}
	return 0;
}

E - Nastya and Rice

简单模拟

代码:

include

#include<cstring>
#include<cstdlib>
#include<math.h>
#include<map>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
	int a,b,c,d,n,t;
	scanf("%d",&t);
	while (t--){
		scanf("%d %d %d %d %d",&n,&a,&b,&c,&d);
		if (n*(a+b)<(c-d)||n*(a-b)>(c+d)){
			printf("No\n");
		}
		else{
			printf("Yes\n");
		}
	}
	return 0;
}

F - Nastya and Door

用前缀和来做,此题的坑是可能它没有山峰

代码:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<math.h>
#include<map>
#include<iostream>
#include<algorithm>
using namespace std;
int s[200102];
int ss[200102];
int main(){
	int b,c,d,t,n,x=0,y=0,z,k;
	cin>>t;
	while(t--){
		y=0;z=1;
		cin>>n>>k;
		memset(s,0,sizeof(s));
		memset(ss,0,sizeof(ss));
		for(int i=1;i<=n;i++)
			cin>>s[i];
		for(int i=2;i<n;i++){
			if(s[i]>s[i-1]&&s[i]>s[i+1])
				ss[i]=1;
			ss[i]+=ss[i-1];
		}
		for(int i=1;i+k-1<=n;i++){
			int a=ss[i+k-2]-ss[i];
			if(y<a){
				y=a;
				z=i;
			}
		}	
		printf("%d %d\n",y+1,z);
	}
	return 0;
}

猜你喜欢

转载自www.cnblogs.com/pioneerjiesen/p/12926701.html