https://www.luogu.com.cn/problem/P1042
需要注意的是: 那个分数差大于2才结束这一局。例: 11:10 就得继续打 直到例如12:10分差大于2才结束这一局。
#include
#include
#include
#include
#include
using namespace std;
char a[103000];
vector<string>m,n;
int main(void)
{
int i=1;
int score1=0,score2=0,score3=0,score4=0;
while(cin>>a[i],a[i]!='E') i++;
for(int j=1;j<i;j++)
{
if(a[j]=='W') score1++,score3++;
else score2++,score4++;
if((score1>=11||score2>=11)&&abs(score1-score2)>=2)
{
string a=to_string(score1);
a+=":",a+=to_string(score2);
score1=0,score2=0;
m.push_back(a);
}
if( ( score3>=21||score4>=21 )&&abs(score3-score4)>=2)
{
string a=to_string(score3);
a+=":",a+=to_string(score4);
score3=0,score4=0;
n.push_back(a);
}
}
//处理最后一次 11赛制
string a=to_string(score1);
a+=":",a+=to_string(score2);
score1=0,score2=0;
m.push_back(a);
//处理最后一次 21赛制
a.clear();
a=to_string(score3);
a+=":",a+=to_string(score4);
score3=0,score4=0;
n.push_back(a);
for(int i=0;i<m.size();i++) cout<<m[i]<<endl;
cout<<endl;
for(int i=0;i<n.size();i++) cout<<n[i]<<endl;
return 0;
}
https://www.luogu.com.cn/problem/P2670
#include
#include
#include
using namespace std;
char mp[105][105];
int vis[105][105];
int dx[8]={-1,0,1,0,-1,-1,1,1};
int dy[8]={0,1,0,-1,-1,1,-1,1};
int ans;
int n,m;
void dfs(int x,int y)
{
for(int i=0;i<8;i++)
{
int tempx=x+dx[i];
int tempy=y+dy[i];
if(tempx<0||tempx>=n||tempy<0||tempy>=m) continue;
if(mp[tempx][tempy]=='*') ans++;
}
}
int main(void)
{
cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>mp[i][j];
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(mp[i][j]=='?')
{
ans=0;
dfs(i,j);
vis[i][j]=ans;
}
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(mp[i][j]=='*') cout<<mp[i][j];
else cout<<vis[i][j];
}
cout<<endl;
}
return 0;
}
https://www.luogu.com.cn/problem/P1563
#include
#include
using namespace std;
struct student
{
string name;
int d;
}stu[100005];
int main(void)
{
int n,m;cin>>n>>m;
for(int i=0;i<n;i++) cin>>stu[i].d>>stu[i].name;
int ans=0;
while(m--)
{
int a,s; cin>>a>>s;//0左 1右
//外
if(stu[ans].d)
if(a) ans=(n+ans-s)%n;//右
else ans=(ans+s)%n;//左
//内
else
if(a) ans=(ans+s)%n;//右
else ans=(n+ans-s)%n;//左
}
cout<<stu[ans].name<<endl;
return 0;
}
https://www.luogu.com.cn/problem/P1601
#include
#include
#include
#include
#include
using namespace std;
vector<int>A,B,C;
vector<int> add(vector<int> &A,vector<int> &B)
{
vector<int> C; int t=0;
for(int i=0;i<A.size()||i<B.size();i++)
{
if(i<A.size()) t+=A[i];
if(i<B.size()) t+=B[i];
C.push_back(t%10);
t/=10;
}
if(t) C.push_back(1);
return C;
}
int main(void)
{
string a,b; cin>>a>>b;
for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0');
C=add(A,B);
for(int i=C.size()-1;i>=0;i--) cout<<C[i];
cout<<endl;
return 0;
}
#include
#include
#include
#include
using namespace std;
vector<int>A,B,C;
vector<int> mul(vector<int> &A,vector<int> &B)
{
int t=0; vector<int> C;
C.push_back(0);//目的是容器里初始化
for(int j=0;j<B.size();j++)
{
for(int i=0;i<A.size();i++)
{
C.push_back(0);
C[i+j]+=A[i]*B[j];
}
}
for(int i=0;i<C.size();i++)//处理进位
{
if(C[i]>=10)
C[i+1]+=C[i]/10,C[i]=C[i]%10;
}
while(C.size()>1&&C.back()==0) C.pop_back();//处理前导零
return C;
}
int main(void)
{
string a,b; cin>>a>>b;
for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0');
C=mul(A,B);
for(int i=C.size()-1;i>=0;i--) cout<<C[i];
cout<<endl;
return 0;
}
https://www.luogu.com.cn/problem/P1009
#include
#include
#include
using namespace std;
vector<int>A,C;
vector<int> add(vector<int> &A,vector<int> &B)
{
vector<int> C; int t=0;
for(int i=0;i<A.size()||i<B.size();i++)
{
if(i<A.size()) t+=A[i];
if(i<B.size()) t+=B[i];
C.push_back(t%10);
t/=10;
}
if(t) C.push_back(1);
return C;
}
vector<int> mtl(vector<int> &A,int b)
{
vector<int> C; int t=0;
for(int i=0;i<A.size()||t;i++)
{
if(i<A.size()) t+=A[i]*b;
C.push_back(t%10);
t/=10;
}
while(C.size()>1&&C.back()==0) C.pop_back();
return C;
}
int main(void)
{
int n;cin>>n;
A.push_back(1);
for(int i=1;i<=n;i++)
{
A=mtl(A,i);
C=add(A,C);
}
for(int i=C.size()-1;i>=0;i--) cout<<C[i];
cout<<endl;
return 0;
}
https://www.luogu.com.cn/problem/P4924
#include
#include
using namespace std;
int a[505][505];
int b[505][505];
int main(void)
{
int n,m; cin>>n>>m;
int sum=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
a[i][j]=sum;
b[i][j]=a[i][j];
sum++;
}
}
while(m--)
{
int x,y,r,z;
cin>>x>>y>>r>>z;
int R=2*r+1;
x=x-r,y=y-r;//左上角的坐标
if(z)//逆时针
{
int w1=x+2*r;//右下角的坐标
int w2=y+2*r;//
int temp1=w1;
int temp2=w2;
for(int i=x;i<=w1;i++)
{
temp1=x;
for(int j=y;j<=w2;j++)
{
b[i][j]=a[temp1++][temp2];
}
temp2--;
}
for(int i=x;i<=w1;i++)//复制
{
for(int j=y;j<=w2;j++)
{
a[i][j]=b[i][j];
}
}
}
else//顺时针
{
int w1=x+2*r;
int w2=y+2*r;
int temp1=w1;
int temp2=y;
for(int i=x;i<=w1;i++)//顺时针
{
temp1=w1;
for(int j=y;j<=w2;j++)
{
b[i][j]=a[temp1--][temp2];
}
temp2++;
}
for(int i=x;i<=w1;i++)//复制
{
for(int j=y;j<=w2;j++)
{
a[i][j]=b[i][j];
}
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}
https://www.luogu.com.cn/problem/P1328
#include
#include
using namespace std;
int a[205],b[205];
int main(void)
{
int N,NA,NB;
cin>>N>>NA>>NB;
for(int i=0;i<NA;i++) cin>>a[i];
for(int i=0;i<NB;i++) cin>>b[i];
int s1=0,s2=0;
int score1=0,score2=0;
while(N--)
{
bool flag=false;
if(s1==NA) s1=0;
if(s2==NB) s2=0;
if(a[s1]==b[s2])
{
s1++,s2++;
continue;
}
if(a[s1]==0&&(b[s2]==2||b[s2]==3)) score1++,flag=true; //剪刀
if(a[s1]==1&&(b[s2]==0||b[s2]==3)) score1++,flag=true;//石头
if(a[s1]==2&&(b[s2]==1||b[s2]==4)) score1++,flag=true;//布
if(a[s1]==3&&(b[s2]==2||b[s2]==4)) score1++,flag=true;//蜥蜴人
if(a[s1]==4&&(b[s2]==0||b[s2]==1)) score1++,flag=true;//斯波特
if(!flag) score2++;
s1++,s2++;
}
cout<<score1<<" "<<score2<<endl;;
return 0;
}
https://www.luogu.com.cn/problem/P1518
题解: 跟蛇形数组差不多一样,不过是同时进行两个罢了,再加一点特判。
#include
#include
#include
using namespace std;
string a[15];
int dx[4]={-1,0,1,0};//上,右,下,左
int dy[4]={0,1,0,-1};
int ans;
int startx,starty,endx,endy;
bool flag=false;
int main(void)
{
for(int i=0;i<10;i++) cin>>a[i];
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
if(a[i][j]=='C') startx=i,starty=j;
if(a[i][j]=='F') endx=i,endy=j;
}
}
int d1=0;
int d2=0;
while(1)
{
if(ans>=1000) break;
if(startx==endx&&starty==endy)
{
flag=true;
break;
}
int tempx=startx+dx[d1];
int tempy=starty+dy[d1];
if(tempx<0||tempx>=10||tempy<0||tempy>=10||a[tempx][tempy]=='*') d1=(d1+1)%4;//撞墙改方向
else startx=tempx,starty=tempy;
tempx=endx+dx[d2];
tempy=endy+dy[d2];
if(tempx<0||tempx>=10||tempy<0||tempy>=10||a[tempx][tempy]=='*') d2=(d2+1)%4;//撞墙改方向
else endx=tempx,endy=tempy;
ans++;
}
if(flag)cout<<ans<<endl;
else cout<<0<<endl;
return 0;
}
https://www.luogu.com.cn/problem/P1067
#include
#include
using namespace std;
int a[105];
int main(void)
{
int n; cin>>n;
for(int i=0;i<n+1;i++) cin>>a[i];
bool flag=false;
int cnt=-1;
for(int i=0;i<n+1;i++)
{
if(a[i]&&i!=n)
{
cnt++;
if(cnt&&a[i]>0)cout<<"+";// 说明前面有不为0的系数且当前是正系数,那么在前面输入一个+号
if(a[i]>1) printf("%dx",a[i]),flag=true;
if(a[i]==1) printf("x"),flag=true;
if(a[i]<0)
{
if(a[i]==-1)
printf("-x");
else
printf("%dx",a[i]);
flag=true;
}
if((n-i)!=1) printf("^%d",n-i);//x的系数不为1,输出x的系数
}
if(i==n&&a[i]!=0)//最后一个数,且不为0.为0的话直接不输出就行了
{
if(cnt>=0)//前面有不为0的系数
if(a[i]<0)
{
printf("%d",a[i]);
flag=true;
}
else cout<<"+"<<a[i],flag=true;
else//前面的系数都是零那么不需要+ 号
if(a[i]<0)
{
printf("%d",a[i]);
flag=true;
}
else cout<<a[i],flag=true;
}
}
if(!flag) cout<<0<<endl;
return 0;
}
https://www.luogu.com.cn/problem/P1098
#include
#include
#include
using namespace std;
string a,ans;
int main(void)
{
int p1,p2,p3; cin>>p1>>p2>>p3;
cin>>a;
for(int i=0;i<a.size();i++)
{
if(i==0||i==a.size()-1||a[i]!='-')//开头结尾不用管,不是减号的不用管
{
ans+=a[i]; continue;
}
if((a[i+1]-a[i])==1)//连着的
{
ans+='-';
ans+=a[i+1];
i++;
continue;
}
if(a[i-1]>=a[i+1])//左大于右
{
ans+='-';
ans+=a[i+1];
i++;
continue;
}
if( (a[i-1]>='a'&&a[i+1]>='a') || (a[i-1]>='0'&&a[i-1]<='9'&&a[i+1]>='0'&&a[i+1]<='9') )
//减号两边是数字的,减号两边是字母
{
if(p1==1)//小写
{
if(p3==1)//正序
{
int n=a[i+1]-a[i-1];
int temp=p2;
for(int j=1;j<n;j++)
{
temp=p2;
while(temp--)
{
ans+=tolower(a[i-1]+j);
}
}
}
else//逆序
{
int n=a[i+1]-a[i-1];
int temp=p2;
for(int j=n-1;j>=1;j--)
{
temp=p2;
while(temp--)
{
ans+=tolower(a[i-1]+j);
}
}
}
}
if(p1==2)//大写
{
if(p3==1)//正序
{
int n=a[i+1]-a[i-1];
int temp=p2;
for(int j=1;j<n;j++)
{
temp=p2;
while(temp--)
{
ans+=toupper(a[i-1]+j);
}
}
}
else//逆序
{
int n=a[i+1]-a[i-1];
int temp=p2;
for(int j=n-1;j>=1;j--)
{
temp=p2;
while(temp--)
{
ans+=toupper(a[i-1]+j);
}
}
}
}
if(p1==3)
{
int n=a[i+1]-a[i-1];
int temp=p2;
for(int j=n-1;j>=1;j--)
{
temp=p2;
while(temp--)
{
ans+="*";
}
}
}
}
else
{
ans+='-';
ans+=a[i+1];
i++;
continue;
}
}
cout<<ans<<endl;
return 0;
}
https://www.luogu.com.cn/problem/P1786
#include
#include
#include
#include
#include
using namespace std;
struct student
{
string name;
string a;
int money;
int level;
int id;
}st,stu[120];
vector<student>a,b,c,d,e,f,g;
//帮主,两位副帮主,两位护法,四位长老,七位堂主,二十五名精英,帮众
int c1=2,d1=4,e1=7,f1=25;
bool cmp(student a,student b)//帮贡排序
{
if(a.money==b.money)
return a.id<b.id;
return a.money>b.money;
}
bool cmp1(student a,student b)//等级排序
{
if(a.level==b.level)
return a.id<b.id;
return a.level>b.level;
}
int main(void)
{
int n; cin>>n;
int m=0;
for(int i=0;i<n;i++)
{
cin>>st.name>>st.a>>st.money>>st.level;
st.id=i;
if(st.a=="BangZhu") a.push_back(st);//帮主
if(st.a=="FuBangZhu") b.push_back(st);//副帮主
if(st.a!="BangZhu"&&st.a!="FuBangZhu") stu[m++]=st;
}
sort(stu,stu+m,cmp);//帮贡排序
for(int i=0;i<m;i++)
{
if(c1>=1)
{
stu[i].a="HuFa",c.push_back(stu[i]),c1--;
continue;
}
if(d1>=1)
{
stu[i].a="ZhangLao",d.push_back(stu[i]),d1--;
continue;
}
if(e1>=1)
{
stu[i].a="TangZhu",e.push_back(stu[i]),e1--;
continue;
}
if(f1>=1)
{
stu[i].a="JingYing",f.push_back(stu[i]),f1--;
continue;
}
stu[i].a="BangZhong",g.push_back(stu[i]);
}
sort(b.begin(),b.end(),cmp1);
sort(c.begin(),c.end(),cmp1);
sort(d.begin(),d.end(),cmp1);
sort(e.begin(),e.end(),cmp1);
sort(f.begin(),f.end(),cmp1);
sort(g.begin(),g.end(),cmp1);
if(a.size())
for(int i=0;i<a.size();i++) cout<<a[i].name<<" "<<a[i].a<<" "<<a[i].level<<endl;
if(b.size())
for(int i=0;i<b.size();i++) cout<<b[i].name<<" "<<b[i].a<<" "<<b[i].level<<endl;
if(c.size())
for(int i=0;i<c.size();i++) cout<<c[i].name<<" "<<c[i].a<<" "<<c[i].level<<endl;
if(d.size())
for(int i=0;i<d.size();i++) cout<<d[i].name<<" "<<d[i].a<<" "<<d[i].level<<endl;
if(e.size())
for(int i=0;i<e.size();i++) cout<<e[i].name<<" "<<e[i].a<<" "<<e[i].level<<endl;
if(f.size())
for(int i=0;i<f.size();i++) cout<<f[i].name<<" "<<f[i].a<<" "<<f[i].level<<endl;
if(g.size())
for(int i=0;i<g.size();i++) cout<<g[i].name<<" "<<g[i].a<<" "<<g[i].level<<endl;
return 0;
}
https://www.luogu.com.cn/problem/P1591
#include
#include
#include
#include
using namespace std;
vector<int> mtl(vector<int> &A,int b)
{
int t=0; vector<int> C;
for(int i=0;i<A.size()||t;i++)
{
if(i<A.size()) t+=A[i]*b;
C.push_back(t%10);
t/=10;
}
while(C.size()>1&&C.back()==0) C.pop_back();
return C;
}
int main(void)
{
int t; cin>>t;
while(t--)
{
int n,a; cin>>n>>a;
vector<int> A; A.push_back(1);
for(int i=1;i<=n;i++)
{
A=mtl(A,i);
}
int ans=0;
for(int i=0;i<A.size();i++) if(a==A[i]) ans++;
cout<<ans<<endl;
}
return 0;
}
https://www.luogu.com.cn/problem/solution/P1249?page=1
本题的关键在于贪心,如何分解是本题的关键。
我们从 2开始一直枚举,如果枚举到余数 ,比上一个的因子还小于等于。那么此时就将此时的余数分配。
给我们已经确定的因子挨个的加1.先给大数加1 再给小的数加1,直到余数为0.
例: 10
2 3 4 此时余1 不能再把5选了。 那么此时把余数从后往前依次的分配1,循环直到分配完。
2 3 4+1 分配完了结束 此时最优解为 2 3 5
#include
#include
#include
#include
using namespace std;
vector<int>A,C;
vector<int> mtl(vector<int> &A,int b)
{
int t=0; vector<int> C;
for(int i=0;i<A.size()||t;i++)
{
if(i<A.size()) t+=A[i]*b;
C.push_back(t%10);
t/=10;
}
while(C.size()>1&&C.back()==0) C.pop_back();
return C;
}
int main(void)
{
int n; cin>>n;
C.push_back(1);
int s=0;
for(int i=2;i<=10005;i++)
{
if( (n-i)<=i)
{
n=n-i;
A.push_back(i);
break;
}
A.push_back(i);
n=n-i;
}
int startx=A.size()-1;
while(n--)//将余数分配 按给大数到小数的方式循环分配,直到分配完
{
A[startx--]++;
if(startx<0)
{
startx=A.size()-1;
}
}
for(int i=0;i<A.size();i++)
{
cout<<A[i]<<" ";
C=mtl(C,A[i]);
}
cout<<endl;
for(int i=C.size()-1;i>=0;i--) cout<<C[i];
return 0;
}
https://www.luogu.com.cn/problem/P1045
题解: 本题可是卡了我好久,本题考察的知识点真的不少。
首先有高精度的乘法,高精度的减法,快速幂,和数学的换底公式。
首先我们要知道,数据范围十分的大,故我们再算该精度乘法的时候只要后500位就行了。
所以我们还得单独的算数据的位数。
#include
#include
#include
#include
using namespace std;
vector<int> ve;
vector<int> A;
vector<int> mul(vector<int> A,vector<int> B)//乘法
{
vector<int> C; int t=0;
C.push_back(0);
for(int i=0;i<A.size();i++)
{
for(int j=0;j<B.size();j++)
{
C.push_back(0);
C[i+j]+=A[i]*B[j];
}
}
for(int i=0;i<C.size();i++)
{
if(C[i]>=10) C[i+1]+=C[i]/10;C[i]%=10;
}
while(C.size()>1&&C.back()==0) C.pop_back();
while(C.size()>500) C.pop_back();//只要最后的500位
return C;
}
vector<int> f(int a,int b)//快速幂
{
vector<int> C; C.push_back(1);
vector<int> A; A.push_back(2);
while(b)
{
if(b&1) C=mul(C,A);
b=b>>1;
A=mul(A,A);
}
return C;
}
vector<int> sub(vector<int> A,int b) //减法
{
int t=1; vector<int> C;
for(int i=0;i<A.size();i++)
{
t=A[i]-t;
C.push_back((t+10)%10);
if(t<0) t=1;
else t=0;
}
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
int main(void)
{
int a; cin>>a;
vector<int> C=f(2,a);
C=sub(C,1);
cout<<(int)(log10(2)*a+1)<<endl;
if(C.size()>=500)
{
int k=0;
for(int i=499;i>=0;i--)
{
cout<<C[i],k++;
if(k==50) cout<<endl,k=0;
}
}
else
{
int temp=500-C.size();//不足500补一些零
int k=0;
for(int i=1;i<=temp;i++)
{
cout<<0,k++;
if(k==50) cout<<endl,k=0;
}
for(int i=C.size()-1;i>=0;i--)
{
cout<<C[i],k++;
if(k==50) cout<<endl,k=0;
}
}
return 0;
}