字符串+模拟。
一开始用了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;
}
题目数据比较水,正反贪心可以过,但实际上不应该贪心,应该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;
}
dp
#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;
}
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;
}
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;
}
signed main(){
IOS;
double h,bmi;cin>>h>>bmi;
h/=100;
double w=h*h*bmi;
cout<<fixed<<setprecision(3)<<w;
return 0;
}
队友写的
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;
}
倒过来处理
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;
}
简单的构造
signed main(){
IOS;
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cout<<0<<" "<<i<<endl;
}
return 0;
}