题目链接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;
}