北京化工大学第十八届程序设计竞赛 - 女生赛

A Hello Word

北京化工大学第十八届程序设计竞赛 - 女生赛_第1张图片

字符串+模拟。
一开始用了string,但处理backspace的时候不方便,换成char*并且用len维护字符串长度。
ctrl+z是撤销上一次有效的输入操作,需要用栈维护,而且撤销操作不入栈,因此solve函数中我定义了x来区分是正常输入还是撤销操作

#include
using namespace std;
#define int long long
#define fer(i,a,b) for(int i=a;i<b;i++)
#define cf int T;cin>>T;while(T--)
#define pb push_back
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
const int N=1e5+5,mod=1e9+7;
char res[N];
string s;
stack<string>last; 
bool f=0;//0是小写
int len;
void solve(string s,int x){
	if(x){//正常输入 
		if(s=="SPACE"){//输入空格 
			res[len]=' ';len++;
			string t="BACKSPACE";last.push(t);//撤销是删除,压入栈 
		}else if(s=="CAPSLOCK"){//切换大小写 
			if(f==0)f=1;
			else f=0;
		}else if(s=="BACKSPACE"){//删除,撤销是加上对应的东西 
			if(len){
				char tmp=res[len-1];string t="";t+=tmp;last.push(t);
				res[len-1]=0;len--;
			}
		}else if(s=="CTRL+Z"){//撤销,弹出栈内元素 
			string tmp;
			if(last.size()){
				tmp=last.top();
				last.pop();
				solve(tmp,0);
				//cout<<"撤销"; 
			}
		}else if(s.size()==1){//输入字母 
			char tmp=s[0];
			if(tmp>='A'&&tmp<='Z')tmp+='a'-'A';
			if(f==0)res[len]=tmp;
			else res[len]=tmp-'a'+'A';
			string t="BACKSPACE";
			last.push(t);
			len++;
		}else if(s[0]=='S'&&s[1]=='H'&&s[2]=='I'&&s[3]=='F'&&s[4]=='T'){//反向输入字母 
			char tmp=s[6];
			if(tmp>='A'&&tmp<='Z')tmp+='a'-'A';
			if(f==0)res[len]=tmp-'a'+'A';
			else res[len]=tmp;
			string t="BACKSPACE";
			last.push(t);
			len++;
		}
	}else{//撤销 
		if(s=="BACKSPACE"){//删除,撤销是加上 
			if(len){
				res[len-1]=0;
				len--;
			}
		}else if(s.size()==1){//输入字母 
			res[len]=s[0];
			len++;
		}
	}
	cout<<res<<endl;
}

signed main(){
	IOS;
	while(last.size())last.pop();
	cf{
		cin>>s;
		solve(s,1);
	}
	cout<<res<<endl;
	return 0;
	
}

B 姐就是女王

北京化工大学第十八届程序设计竞赛 - 女生赛_第2张图片

题目数据比较水,正反贪心可以过,但实际上不应该贪心,应该dp
AC97%的正向贪心

signed main(){
    IOS;
    cin>>n>>l>>r;
    int a,b;
    priority_queue<int,vector<int>,greater<int> > pq;
    sum=1;
    fer(i,0,n){
        cin>>a>>b;
        if(a<b){
            sum+=a;
            pq.push(b-a);
            add[k++]=b-a;
        }else{
            sum+=b;
            pq.push(a-b);
            add[k++]=a-b;
        }
    }
    int temp=sum;
    if(sum>=l&&sum<=r){
        f=1;
    }else if(sum>r){
        f=0;
    }else{
        while(sum<l&&pq.size()){
            int t=pq.top();pq.pop();
            sum+=t;
        }
        if(sum>=l&&sum<=r)f=1;
        else f=0;
    } 
    if(f)cout<<"Yes"<<endl;
    else cout<<"No"<<endl;

    return 0;
     
}

C 魅惑菇

北京化工大学第十八届程序设计竞赛 - 女生赛_第3张图片

dp

D COMBO

北京化工大学第十八届程序设计竞赛 - 女生赛_第4张图片

#include
using namespace std;
#define int long long
#define fer(i,a,b) for(int i=a;i<b;i++)
#define cf int T;cin>>T;while(T--)
#define pb push_back
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

const int N=1e5+7,mod=1e9+7;
int zero[N];
int k=1;
signed main(){
	IOS;
	int n,m;cin>>n>>m;
	string s;cin>>s;
	zero[0]=0;
	fer(i,0,s.size()){
		if(s[i]=='0'){
			zero[k++]=i+1;
		}
	}
	int mx=0;
	if(k<=m)cout<<n;
	else{
		int l,r;
		fer(i,1,k+1-m){
			l=zero[i-1]+1;
			if(i==k-m){
				r=k-1;
			}else{
				r=zero[i+m]-1;
			}
			mx=max(mx,r-l+1);
		}
		cout<<mx<<endl;
	}
	
	return 0;
	
}

E yesnocmp

signed main(){
	IOS;
	int a,b;cin>>a>>b;
	string s;cin>>s;
	bool f=0;
	if((a>0&&b>0)||(a<0&&b<0))f=1;
	else f=0;
	fer(i,0,s.size()){
		if(s[i]>='A'&&s[i]<='Z')
			s[i]+='a'-'A';
	}
	if((s=="yes"&&f)||(s=="no"&&!f))cout<<"ok";
	else cout<<"wa";
	return 0;
	
}

F 简简单单解方程

signed main(){
	IOS;
	int a,b;
	cin>>a>>b;
	int x=(a+b)/2;
	int y=(a-b)/2;
	cout<<x<<" "<<y<<endl; 
	return 0;
	
}

G 魔术师的数学秘密

signed main(){
	IOS;
	double h,bmi;cin>>h>>bmi;
	h/=100;
	double w=h*h*bmi;
	cout<<fixed<<setprecision(3)<<w;
	return 0;
}

H 异或怎么你了?

北京化工大学第十八届程序设计竞赛 - 女生赛_第5张图片

队友写的

int Wei(int n)
{
	int cnt = 0;
	while(n){
		n>>=1;
		cnt++;
	}
	return cnt;
}
signed main()
{
cf{
	int n;
	cin >> n;
	int a = 1, b = 0;
	int wei = Wei(n);
//	cout << wei << endl;
	if(n == 0){
		cout << 0 <<endl;
		continue; 
	}
	for(int i = wei-2;i>=0;i--){
		if((n>>i)&1){
			int x = a&1;
		//	cout << x <
			b <<= 1;
			b += x;
			if(b&1){
				a <<= 1;
			}else{
				a <<= 1;
				a ++;
			}
		}else{
			int x = a&1;
		//	cout << x << endl;
			b <<= 1;
			b += x;	
			a <<= 1;
			a += b&1;
		}
	}
	cout << a <<endl;
}
return 0;
}

I 洞穴寻宝

北京化工大学第十八届程序设计竞赛 - 女生赛_第6张图片

倒过来处理

signed main(){
	IOS;
	string s="";
	int a, b;
	cin >> a >> b;
	while(a!=1||b!=1){
		if(a > b){
			a -= b;
			s += 'L'; 
		} else{
			b-=a;
			s+='R';
		}
	}
	reverse(s.begin(),s.end());
	cout << s << endl;
	return 0;
	
}

J 地铁网络

K 村庄建造

北京化工大学第十八届程序设计竞赛 - 女生赛_第7张图片

简单的构造

signed main(){
	IOS;
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cout<<0<<" "<<i<<endl;
	}
	return 0;
	
}

你可能感兴趣的:(acm,buctoj,c++,算法)