T1:把最小非0数放在第一,剩下的按升序排列即可
int s;
cin >>s;
vector<int> alls;
while(s){
alls.push_back(s%10);
s = s/10;
}
sort(alls.begin(),alls.end());
int a;
for(int i=0;i<alls.size();i++){
if(alls[i]!=0){
a = i;
break;
}
}
cout << alls[a];
for(int i=0;i<alls.size();i++){
if(i!=a){
cout << alls[i];
}
}
cout << endl;
T2:很简单的语法题
int a,b;
cin >> a >> b;
cout << 2*a+b<<endl;
T3 : n组数,每组两个,每次从第i组任选1个数,最后n组选出的和为x,暴力明显超时,使用dp[i][j]表示前 i 次跳跃后,是否能到达 j 点。
int n, x;
cin >> n >> x;
f[0][0] = 1;
for (int i = 1 ; i <= n ; i ++){
int a, b;
cin >> a >> b;
for (int j = 0 ; j <= N - a ; j ++){
if (f[i - 1][j]){
f[i][j + a] = f[i - 1][j];}
}
for (int j = 0 ; j <= N - b ; j ++){
if (f[i - 1][j]){
f[i][j + b] = f[i - 1][j];}
}
}
if (f[n][x]){
cout << "YES" << endl;}
else {
cout << "NO" << endl;}
T4 : 考虑对于第i个点,只能由第i-1和第i-2个点走到,一个变形的斐波那契数列
dp[4] = 3;
dp[5] = 5;
for(int i=6;i<=30;i++){
dp[i]=dp[i-1]+dp[i-2];
}
while(t--){
int x;
cin >>x;
cout << dp[x] << endl;
}
T5:赛时考虑复杂了,以为剪去 i-i+k以后,i之前和i+k之后会合并,这样就复杂了,后来发现自己想多了,只需要sort一下1 + n*k即可
int n,k;
cin >> n >> k;
for(int i=1;i<=n;i++){
cin >> q[i];
}
vector<int> alls;
for(int i=1;i<=n;i+=k){
if(i>n){
break;
}
else{
alls.push_back(q[i]);
}
}
sort(alls.begin(),alls.end(),greater<int>());
cout << alls[0];
T6 :一道大模拟,其实并不难,记得判断是否是同行同列,当时防火墙抽风了,于是有几个if写的比较乱
int n;
cin >>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin >> q[i][j];
}
}
int t;
cin >>t;
while(t--){
int w;
cin >>w;
if(w==1){
int x1,x2,x3,y1,y2,y3;
bool q1 = false,q2=false,q3=false;
int f = 0;
cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3 ;
if(q[x1][y1]=='.'){
q1 = true;f++;
}
if(q[x2][y2]=='.'){
q2 = true;f++;
}
if(q[x3][y3]=='.'){
q3 = true;f++;
}
if(x1==x2&&x2==x3||y1==y2&&y2==y3){
if(f>=2){
yes;goto loop;
}
if(q1){
if(q[x2][y2]==q[x3][y3]){
yes;goto loop;
}
}
if(q2){
if(q[x1][y1]==q[x3][y3]){
yes;goto loop;
}
}
if(q3){
if(q[x1][y1]==q[x2][y2]){
yes;goto loop;
}
}
if(q[x2][y2]==q[x3][y3]&&q[x3][y3]==q[x1][y1]){
yes;goto loop;
}
}
no;goto loop;
}
if(w==2){
int x,y;
char c;
cin >> x >> y >> c;
q[x][y]= c;
}
loop:;
}
return 0;
T7:当时想用前缀和做,后来发现限制在5000内可以暴力解决,模拟即可
vector<int>alls;
int n;
cin >> n;
string str;
cin >> str;
for(int i=0;i<26;i++){
cin >> v[i];
}
int q;
cin >> q;
while(q--){
int op;
cin >> op;
if(op==1){
string s;
cin >> s;
str += s;
}
if(op == 2){
int ans = 0;
for(int i=0;i<str.size();i++){
ans += v[str[i]-'a'];
}
cout << ans << endl;
}
if(op == 3){
int l,r;
cin >> l >> r;
string ss = "";
for(int i=0;i<l-1;i++){
ss += str[i];
}
for(int i=r;i<str.size();i++){
ss += str[i];
}
str = ss;
}
}
return 0;