A
水
#include <bits/stdc++.h>
#define N 100100
#define INF 0x3f3f3f3f
#define LL long long
#define mem(a,n) memset(a,n,sizeof(a))
#define fread freopen("in.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)
using namespace std;
int arr[N][2];
int main()
{
ios::sync_with_stdio(false);
int n;
LL ans;
while(cin>>n){
ans=0;
for(int i=0;i<=n;++i){
cin>>arr[i][0]>>arr[i][1];
}
for(int i=1;i<=n;++i){
ans+=abs(arr[i][0]-arr[i-1][0])+abs(arr[i][1]-arr[i-1][1]);
}
cout<<ans<<endl;
}
return 0;
}
B
使用两个map\
#include <bits/stdc++.h>
#define N 10100
#define INF 0x3f3f3f3f
#define LL long long
#define mem(a,n) memset(a,n,sizeof(a))
#define fread freopen("in.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)
using namespace std;
int main()
{
ios::sync_with_stdio(false);
map<char,int> countto,countfrom;
map<char,char> mpto,mpfrom;
string line1,line2,temp;
bool ok;
while(cin>>line1){
mpto.clear(),mpfrom.clear();
countto.clear(),countfrom.clear();
cin>>line2;
for(int i=0;i<line1.size();++i){
if(mpto[line1[i]]!=line2[i]){
++countto[line1[i]];
}
mpto[line1[i]]=line2[i];
if(mpfrom[line2[i]]!=line1[i]){
++countfrom[line2[i]];
}
mpfrom[line2[i]]=line1[i];
}
/*for(auto a=mpto.begin(),b=mpto.end();a!=b;++a){
cout<<a->first<<' '<<a->second<<end;
}*/
temp.clear();
ok=true;
cin>>line1;
for(int i=0;i<line1.size();++i){
if(countto[line1[i]]==1){
temp+=mpto[line1[i]];
}else{
ok=false;
}
}
if(ok){
cout<<temp<<endl;
}else{
cout<<"Wrong"<<endl;
}
temp.clear();
ok=true;
cin>>line1;
for(int i=0;i<line1.size();++i){
if(countfrom[line1[i]]==1){
temp+=mpfrom[line1[i]];
}else{
ok=false;
}
}
if(ok){
cout<<temp<<endl;
}else{
cout<<"Wrong"<<endl;
}
}
return 0;
}
D
矩阵快速幂
顺便不要看错位置……
#include <bits/stdc++.h>
#define N 10100
#define SIZE 2
#define INF 0x3f3f3f3f
#define LL long long
#define mem(a,n) memset(a,n,sizeof(a))
#define fread freopen("in.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)
using namespace std;
struct Matrix{
LL a[SIZE][SIZE];
Matrix()=default;
Matrix(LL n){
memset(a,0,sizeof(a));
for(LL i=0;i<SIZE;++i){
this->a[i][i]=n;
}
}
Matrix operator*(Matrix &a){
Matrix b;
for(LL i=0;i<SIZE;++i){
for(LL j=0;j<SIZE;++j){
b.a[i][j]=0;
for(LL k=0;k<SIZE;++k){
b.a[i][j]+=this->a[i][k]*a.a[k][j];
}
}
}
return b;
}
void print(){
for(LL i=0;i<SIZE;++i){
for(LL j=0;j<SIZE;++j){
cout<<this->a[i][j]<<' ';
}
cout<<endl;
}
}
};
Matrix MatriMulti(Matrix &a,Matrix &b,LL mod)
{
Matrix c;
for(LL i=0;i<SIZE;++i){
for(LL j=0;j<SIZE;++j){
c.a[i][j]=0;
for(LL k=0;k<SIZE;++k){
c.a[i][j]+=a.a[i][k]*b.a[k][j];
}
c.a[i][j]%=mod;
}
}
//c.print();
return c;
}
Matrix MatriPow(Matrix a,LL n,LL mod)
{
Matrix c(1);
//a.print();
//c.print();
while(n){
if(n&1){
c=MatriMulti(a,c,mod);
n-=1;
}
a=MatriMulti(a,a,mod);
n>>=1;
}
//c.print();
return c;
}
int main()
{
ios::sync_with_stdio(false);
Matrix m;
LL r,s,t;
while(cin>>r>>s>>m.a[0][0]>>m.a[1][0]>>m.a[0][1]>>m.a[1][1]>>t){
m=MatriPow(m,t,1000003);
//m.print();
cout<<(r*(m.a[0][0]+m.a[1][0])+s*(m.a[0][1]+m.a[1][1]))%1000003<<endl;
}
return 0;
}
/**********************************************************************
Problem: 1233
User: CSUzick
Language: C++
Result: AC
Time:0 ms
Memory:1688 kb
**********************************************************************/
E
就是之前基础题里面删数反着来就好了,记得前导零不输出但是后缀零要输出
#include <bits/stdc++.h>
#define N 2020
#define INF 0x3f3f3f3f
#define LL long long
#define mem(a,n) memset(a,n,sizeof(a))
#define fread freopen("in.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)
using namespace std;
int pre[N],post[N];
char num[N];
void init(int n)
{
pre[0]=0;
post[0]=1;
for(int i=1;i<n;++i){
pre[i]=i-1;
post[i]=i+1;
}
}
int main()
{
int d,n,pos,kase;
while(~scanf("%s%d",num,&d)){
kase=0;
pos=0;
n=strlen(num);
init(n);
while(d){
if(num[pre[pos]]>num[pos]){
pos=pre[pos];
}
if(post[pos]<n){
if(num[pos]>num[post[pos]]){
num[pos]=0;
post[pre[pos]]=post[pos];
if(pre[pos]==pos){
pre[post[pos]]=post[pos];
}else{
pre[post[pos]]=pre[pos];
}
--d;
}
pos=post[pos];
}else{
while(d){
num[pos]=0;
pos=pre[pos];
--d;
}
}
}
for(int i=0;i<n;++i){
if(num[i]&&num[i]!='0'||(num[i]=='0'&&kase)){
cout<<num[i];
++kase;
}
}
if(!kase){
cout<<0;
}
cout<<endl;
}
return 0;
}
F
就是对中文用KMP嘛
不过我花了好久时间找wchar/u32char/u16char然后没有成功,心疼自己的智商……
#include <iostream>
#include <string>
#define N 10100
#define INF 0x3f3f3f3f
#define LL long long
#define mem(a,n) memset(a,n,sizeof(a))
#define fread freopen("in.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)
using namespace std;
#include<bits/stdc++.h>
string str1,str2;
int pi[20100]={0};
void KMP();
int main()
{
int k,n,m,t,cnt=0,i,j;
while(cin>>str2){
cin>>str1;
KMP();
m=str2.size()/2;
/*for(int i=0;i<m;++i){
cout<<pi[i]<<' ';
}cout<<endl;*/
k=cnt=0;
for(i=0;2*i<str1.size();++i){
while(k>0&&(str2[2*k]!=str1[2*i]||str2[2*k+1]!=str1[2*i+1])){
k=pi[k-1];
}if(str2[2*k]==str1[2*i]&&str2[2*k+1]==str1[2*i+1]){
++k;
}
if(k==m){
++cnt;
k=pi[k-1];
}
}
cout<<cnt<<endl;
}
return 0;
}
void KMP()
{
int i,k=0;
for(i=1;i*2<str2.size();++i){
while(k>0&&(str2[2*k]!=str2[2*i]||str2[2*k+1]!=str2[2*i+1])){
k=pi[k-1];
}if(str2[2*k]==str2[2*i]&&str2[2*k+1]==str2[2*i+1]){
++k;
}
pi[i]=k;
}
return;
}
G
按理说G不水,但是数据水,所以我A了
#include <bits/stdc++.h>
#define N 10100
#define INF 0x3f3f3f3f
#define LL long long
#define mem(a,n) memset(a,n,sizeof(a))
#define fread freopen("in.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)
using namespace std;
int mp[1<<30];
int main()
{
ios::sync_with_stdio(false);
int n,m,temp;
while(cin>>n>>m){
mp.clear();
for(int i=0;i<m;++i){
cin>>temp;
mp[temp]++;
}
for(int i=0;i<m;++i){
cin>>temp;
}
auto a=mp.begin(),b=mp.end();
for(;a!=b;++a){
if(a->second==1){
cout<<a->first<<' ';
break;
}
}
for(++a;a!=b;++a){
if(a->second==1){
cout<<a->first<<endl;
break;
}
}
}
return 0;
}
顺便欢迎点这里膜钱涛大佬(看正解)
H
直接打表然后暴力就好了
打表:
#include <bits/stdc++.h>
#define N 10100
#define INF 0x3f3f3f3f
#define LL long long
#define mem(a,n) memset(a,n,sizeof(a))
#define fread freopen("in.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)
using namespace std;
int main()
{
ios::sync_with_stdio(false);
for(int i=32;i<100;++i){
cout<<'"'<<i*i<<'"'<<',';
}
return 0;
}
本体:
#include <bits/stdc++.h>
#define N 10100
#define INF 0x3f3f3f3f
#define LL long long
#define mem(a,n) memset(a,n,sizeof(a))
#define fread freopen("in.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)
using namespace std;
string square[68]={"1024","1089","1156","1225","1296","1369","1444","1521","1600","1681","1764","1849","1936","2025","2116","2209","2304","2401","2500","2601","2704","2809","2916","3025","3136","3249","3364","3481","3600","3721","3844","3969","4096","4225","4356","4489","4624","4761","4900","5041","5184","5329","5476","5625","5776","5929","6084","6241","6400","6561","6724","6889","7056","7225","7396","7569","7744","7921","8100","8281","8464","8649","8836","9025","9216","9409","9604","9801"};
bool isok(string &a,string &b);
int main()
{
ios::sync_with_stdio(false);
int kase=0,cnt,n;
string num;
cin>>n;
while(kase<n){
cin>>num;
cnt=0;
for(int i=0;i<68;++i){
if(isok(num,square[i]))++cnt;
}
cout<<"Case "<<++kase<<": "<<cnt<<endl;
}
return 0;
}
bool isok(string &a,string &b)
{
int cnt=0;
for(int i=0;i<4;++i){
if(a[i]!=b[i]){
++cnt;
}
}
if(cnt==1){
return true;
}
return false;
}
K
看数组与自身反过来以后的LCS长度,答案就是单独的长度-LCS长度
#include <bits/stdc++.h>
#define N 10100
#define INF 0x3f3f3f3f
#define LL long long
#define mem(a,n) memset(a,n,sizeof(a))
#define fread freopen("in.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)
using namespace std;
int arr[1010],rev[1010];
int dp[1010][1010];
int main()
{
ios::sync_with_stdio(false);
int t,n;
cin>>t;
while(t--){
mem(dp,0);
cin>>n;
for(int i=1;i<=n;++i){
cin>>arr[i];
rev[n+1-i]=arr[i];
}
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
if(arr[i]==rev[j]){
dp[i][j]=dp[i-1][j-1]+1;
}else{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
cout<<n-dp[n][n]<<endl;
}
return 0;
}
M
就一个模拟,原题在UVaLive,数据换了害我WA了……
#include <iostream>
#define MAXN 1010
#define INF 0x3f3f3f3f
#define LL long long
#define mem(a,n) memset(a,n,sizeof(a))
#define fread freopen("in.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)
using namespace std;
LL arr[5];
int main()
{
// fread;
LL ans;
while(cin>>arr[0]>>arr[1]>>arr[2]>>arr[3]){
ans=-1;
if(arr[0]==-1&&arr[1]==-1&&arr[2]==-1&&arr[3]==-1){
break;
}
if(arr[0]==-1){
if(arr[2]-arr[1]==arr[3]-arr[2]){
ans=arr[1]-arr[2]+arr[1];
}else if(arr[3]*arr[1]==arr[2]*arr[2]){
ans=arr[1]*arr[1]/arr[2];
if(ans*arr[2]!=arr[1]*arr[1]){
ans=-1;
}
}
}else if(arr[1]==-1){
if((arr[3]-arr[2])*2==arr[2]-arr[0]){
ans=arr[2]-arr[3]+arr[2];
}else if(arr[2]%arr[0]==0&&arr[3]%arr[2]==0&&(arr[3]/arr[2])*(arr[3]/arr[2])==arr[2]/arr[0]){
ans=arr[2]*arr[2]/arr[3];
if(arr[2]*arr[2]!=ans*arr[3]){
ans=-1;
}
}
}else if(arr[2]==-1){
if(2*(arr[1]-arr[0])==arr[3]-arr[1]){
ans=arr[3]-arr[1]+arr[0];
}else if(arr[1]%arr[0]==0&&arr[3]%arr[1]==0&&(arr[1]/arr[0])*(arr[1]/arr[0])==arr[3]/arr[1]){
ans=arr[1]*arr[1]/arr[0];
if(ans*ans!=arr[1]*arr[3]){
ans=-1;
}
}
}else if(arr[3]==-1){
if(arr[2]-arr[1]==arr[1]-arr[0]){
ans=arr[2]+arr[2]-arr[1];
}else if(arr[2]*arr[0]==arr[1]*arr[1]){
ans=arr[2]*arr[2]/arr[1];
if(ans*arr[1]!=arr[2]*arr[2]){
ans=-1;
}
}
}
if(ans<=0||ans>10000){
ans=-1;
}
cout<<ans<<endl;
}
return 0;
}
N
脑内画个图就出来通式了
#include <bits/stdc++.h>
#define N 10100
#define INF 0x3f3f3f3f
#define LL long long
#define mem(a,n) memset(a,n,sizeof(a))
#define fread freopen("in.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)
using namespace std;
int main()
{
ios::sync_with_stdio(false);
LL a,b;
while(cin>>a>>b){
if(b>a){
cout<<-1<<endl;
}else{
cout<<a+b<<endl;
}
}
return 0;
}
O
都懒得解释了,这个题就是给你锻炼英语的
#include <bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
#define mem(a,n) memset(a,n,sizeof(a))
#define fread freopen("in.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)
#define N 10100
#define INF 0x3f3f3f3f
#define eps 1e-9
using namespace std;
int arr[55];
int main()
{
ios::sync_with_stdio(false);
int n,cnt,t;
while(cin>>n>>t){
cnt=0;
for(int i=0;i<n;++i){
cin>>arr[i];
}
for(cnt=0;cnt<n;++cnt){
if(t>=arr[cnt]){
t-=arr[cnt];
}else{
break;
}
}
cout<<cnt<<endl;
}
return 0;
}
本文精选了一系列C++编程技巧,包括高效求解数学问题、字符串处理、矩阵运算、数据结构操作等,通过实际代码示例展示了如何解决特定问题。
2116

被折叠的 条评论
为什么被折叠?



