Codeforces Round #501 (Div. 3)

本次只在开场做出了A,C两道题。无奈太困了,直接睡觉了。

A.Points in Segments

简单题,不解释。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;

int a[110]; 
int n,m;

int main()
{
    scanf("%d%d",&n,&m);
	int l,r,cnt=0;
	while(n--){
		scanf("%d%d",&l,&r);
		for(int i=l;i<=r;i++){
			if(!a[i]) cnt++,a[i]=1;
		}
	}
	if(cnt==m){
		printf("0\n");
	}else{
		printf("%d\n",m-cnt);
		bool flag=false;
		for(int i=1;i<=m;i++){
			if(!a[i]){
				if(flag) printf(" %d",i);
				else{
					printf("%d",i);
					flag=true;
				}
			}
		}
	}
    return 0;
}

B.Obtaining the String

模拟题,类似于冒泡排序。比赛过程中太困了,没怎么看这道题。

#include<iostream>
#include<cstdio>
#include<vector> 
using namespace std;
const int maxn=55;
char s[maxn],t[maxn];

int main(){
	int n;
	vector<int>v;
	scanf("%d",&n);
	scanf("%s%s",s,t);
	//printf("%s\n%s\n",s,t);
	int ans=0;
	for(int i=0;i<n;i++){
		int j;
		for(j=i;s[j]!=t[i]&&j<n;j++);
		//cout<<i<<" "<<j<<endl; 
		if(j==n){
			printf("-1\n");
			return 0;
		}
		
		for(int k=j;k>i;k--){
			v.push_back(k); //因为s[]下标从0开始 
			swap(s[k-1],s[k]);
		}
		ans+=j-i;
		
	}
	printf("\n%d\n",ans);
	vector<int>::iterator it;
	for(it=v.begin();it!=v.end();it++){
		if(it==v.begin()){
			printf("%d",*it);
		}else printf(" %d",*it);
	}
	printf("\n");
	return 0;
}

C.Songs Compression

贪心)注意:greater<int>() 头文件为:#include<functional>

简单题,不解释。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<functional>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
int a[maxn],b[maxn],d[maxn];
long long sa=0,sb=0; 
int n,m;

int main()
{
    scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&a[i],&b[i]);
		sa+=a[i];
		sb+=b[i];
		d[i]=a[i]-b[i];
	}
	int cnt=0;
	if(sa<=m) cnt=0;
	else if(sb>m) cnt=-1;
	else if(sb==m) cnt=n;
	else{
		sort(d+1,d+1+n,greater<int>());
		for(int i=1;i<=m;i++){
			//cout<<"cnt="<<cnt<<endl;
			sa-=d[i];
			cnt++;
			if(sa<=m) break;
		}
	}
	printf("%d\n",cnt);
    return 0;
}

D.Walking Between Houses 

题意:总共有n个房子,编号从1-n。问移动k次,总移动步数为s能否实现,实现的话输出移动情况?规定两房子编号之差为移动步数。(贪心;每次移动选取当前能够移动的最大步数)

//贪心 
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main(){
	long long n,k,s;
	scanf("%lld%lld%lld",&n,&k,&s);
	long long mindist=k,maxdist=k*(n-1); 
	if(mindist>s||maxdist<s) printf("NO\n");
	else{
		printf("YES\n");
		long long pos=1;
		long long minmove,cur;
		for(int i=1;i<=k;i++){
			minmove=k-i;
			cur=min(s-minmove,n-1);
			s-=cur;
			if(cur+pos<=n){
				pos+=cur;
				printf("%lld ",pos);
			}else{
				pos-=cur;
				printf("%lld ",pos);
			}
		}
	}
	return 0;
}

E1.Stars Drawing (Easy Edition)

E2.Stars Drawing (Hard Edition)

F.Bracket Substring

猜你喜欢

转载自blog.csdn.net/qq_37275680/article/details/81367934