CF Round#547(Div.3)

题目链接http://codeforces.com/contest/1141

A

刚提交几发,超时了,也没找出问题
然后问了下队友才知道问题出在哪里
题目大概意思:n经过k次乘于2或者乘于3变成m。给定n和m,请输出k。若不存在这样的k,输出-1。

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<cstdio>
#include<vector>
using namespace std;
const int maxn = 10000+10;
const int inf = 0x7fffffff;
struct node{
	int to,w;
};
int n,m;
int gcd(int x,int y){
	if(y==0) return x;
	return gcd(y,x%y);
}
int main()
{
	cin>>n>>m;
	if(m%n!=0){
		cout<<-1<<endl;
		return 0;
	}
	else if(n==m){
		cout<<0<<endl;
		return 0;
	}
	int t=m/n;
	int res=0;
	while(t%2==0){
		t/=2;
		res++;
	}
	while(t%3==0){
		t/=3;
		res++;
	}
	if(t!=1){
		cout<<-1<<endl;
		return 0;
	}
	cout<<res<<endl;
	return 0;
}

B

题目大概意思:有n个01串,问最长连续的1串的长度。第1个和第n个看作是连续的

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<cstdio>
#include<vector>
using namespace std;
const int maxn = 2*2e5+10;
const int inf = 0x7fffffff;

int n,res=0;
int a[maxn];
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for(int i=n+1;i<=2*n;i++){
		a[i]=a[i-n];
	}
	int res=0;
	int t=0;
	for(int i=1;i<=2*n;i++){
		if(a[i]==1) t++;
		else{
			res=max(res,t);
			t=0;
		}
	}
	cout<<res<<endl;
	return 0;
}

C

题目大概意思:求一个数列,数列必须是连续的从1到n。若不存在,输出-1。

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#include<stack>
#include<map>
#include<cstdio>
#include<vector>
using namespace std;
const int maxn = 2e5+10;
const int inf = 0x7fffffff;

int n;
int p[maxn],q[maxn],res[maxn];
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n-1;i++)
		scanf("%d",&q[i]);
	res[n]=p[n]=100000;
	for(int i=n-1;i>=1;i--){
		res[i]=p[i]=p[i+1]-q[i];
	}
	sort(res+1,res+n+1);
	int _min=res[1]-1;
	for(int i=1;i<=n;i++){
		res[i]-=_min;
		p[i]-=_min;
	}
	for(int i=1;i<=n;i++){
		if(res[i]!=i) {
			cout<<-1<<endl;
			return 0;
		}
	}
	for(int i=1;i<n;i++)
		cout<<p[i]<<' ';
	cout<<p[n]<<endl;
	return 0;
}

D

题目大概意思:给定s串和p串,s串中和p串的相同的字符可以配对,问最大的匹配对数。’?'字符为万能字符

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#include<stack>
#include<map>
#include<cstdio>
#include<vector>
using namespace std;
typedef pair<int,int> P;
const int maxn = 150000+10;
const int inf = 0x7fffffff;

int n;
int loc[maxn][27];  //loc[i][j]=k 表示第二行串中字母j第i次出现的位置
int tot[27],ff[27],vis[27]; //tot[i]=k表示第二行串中字母i一共出现k次
string s;
char t;
int flag;
P p[maxn];
int cnt=0;
int main()
{
	cin>>n;
	cin>>s;
	getchar();
	for(int i=0;i<=26;i++) tot[i]=0,ff[i]=0,vis[i]=0;

	for(int i=0;i<n;i++){
		if(s[i]!='?')
			vis[s[i]-'a']++;    //记录第一行串中每个字符出现的次数,?除外
	}
	for(int i=1;i<=n;i++){
		cin>>t;
		if(t=='?') loc[++tot[26]][26]=i;  
		else loc[++tot[t-'a']][t-'a']=i;
	}
	for(int i=0;i<n;i++){    //遍历第一行串
		if(s[i]=='?'){
			flag=0;
			for(int j=0;j<26;j++){
				if(vis[j]<=0 && tot[j]!=0){
					p[cnt].first=i+1,p[cnt++].second=loc[++ff[j]][j];
					tot[j]--;
					flag=1;
					break;
				}
				else if(vis[j]<tot[j]){
					p[cnt].first=i+1,p[cnt++].second=loc[++ff[j]][j];
					tot[j]--;
					flag=1;
					break;
				}
			}
			if(flag==0){
				if(tot[26]!=0){
					p[cnt].first=i+1,p[cnt++].second=loc[++ff[26]][26];
					tot[26]--;
				}
			}

		}
		else{
			if(tot[s[i]-'a']==0){   //如果第二行串中没有该s[i]字符
				if(tot[26]!=0) {    //但是第二行串中有'?'
					p[cnt].first=i+1,p[cnt++].second=loc[++ff[26]][26];
					tot[26]--;
				}
			}
			else{        
				p[cnt].first=i+1,p[cnt++].second=loc[++ff[s[i]-'a']][s[i]-'a'];
				tot[s[i]-'a']--;

			}

		}
		if(s[i]!='?')  vis[s[i]-'a']--;
	}
	cout<<cnt<<endl;
	for(int i=0;i<cnt;i++){
		cout<<p[i].first<<' '<<p[i].second<<endl;
	}
	return 0;
}

E

写这一题很辛苦
题目大概意思:一只有h滴血的怪兽,给定一个长为n的数组,每个值都可以给怪兽增或者减血,问第几步怪兽会死(循环的)。如果怪兽不会死,输出-1。

#include <iostream>
#include <string>
#include <cstring>
#include <cmath>
#include <queue>
#include <algorithm>
#include <stack>
#include <map>
#include <cstdio>
#include <vector>
using namespace std;
typedef pair<int,int> P;
typedef long long ll;
const int maxn = 2e5+10;
const int inf = 0x7fffffff;

int n;
ll h;
ll d[maxn];
ll sum[maxn];
int main()
{
	cin>>h>>n;
	for(int i=1;i<=n;i++)
		cin>>d[i];
	sum[1]=d[1];
	ll minn=sum[1];
	for(int i=2;i<=n;i++){
		sum[i]=sum[i-1]+d[i];
		minn=min(minn,sum[i]);
	}
	if(sum[n]>=0){
		if(h+minn>0) {
			cout<<-1<<endl;
			return 0;
		}
		else{
			for(int i=1;i<=n;i++){
				if(h+sum[i]<=0){
					cout<<i<<endl;
					return 0;
				}
			}
		}
	}
	else{
		if(h+minn<=0){
			for(int i=1;i<=n;i++)
				if(h+sum[i]<=0){
					cout<<i<<endl;
					return 0;
				}
		}
		else{
			ll res=0;
			res=(h+minn)/-sum[n]+1ll*1;
			if((h+minn)%(-sum[n])==0) res--;
			h=h+res*sum[n];
			res*=n;
			
			for(int i=1;i<=n;i++){
				if(sum[i]+h<=0){
					res=res+i;
					cout<<res<<endl;
					return 0;
				}
			}
		}
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Mr_HCW/article/details/88677702