题意是询问1~n中,有多少个数x,满足x的各个数位之和小于x+1数位之和,因为只有9满足,并且每10个数中只有一个9,所以n/10+最后一位是否为9即为答案
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 10;
inline void solve() {
int n; cin >> n;
int ans = n / 10;
if(n % 10 == 9) ans++;
cout << ans << endl;
return ;
}
signed main() {
int t; cin >> t;
while(t--) {
solve();
}
return 0;
}
思路:直接把a的所有情况列出来,最后判断t是否是a所有情况的一个子串即可,复杂度O(n^2)
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 10;
string s, t;
inline void solve() {
cin >> s >> t;
if(s == t) {
cout << "YES" << endl;
return ;
}
string ans[510];
for(int i = 0; i < s.size(); i++) {
for(int j = 0; j <= i; j++) ans[i] = ans[i] + s[j];
for(int j = i - 1; j >= 0; j--) ans[i] = ans[i] + s[j];
}
for(int i = 0; i < s.size(); i++) {
if(ans[i].find(t) != -1) {
cout << "YES" << endl;
return ;
}
}
cout << "NO" << endl;
return ;
}
signed main() {
int t; cin >> t;
while(t--) {
solve();
}
return 0;
}
思路:贪心模拟,为了早点结束,那么比分拉的越大越好,于是可以直接模拟两种贪心情况,第一是第一队比分拉大,第二是第二队比分拉大,最后取二者中的最小值即可。
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 10;
inline void solve() {
string s; cin >> s;
int t1 = 0, t2 = 0, pos = 10;
for(int i = 0; i < s.size(); i++) {
if(i % 2 == 0) {
if(s[i] == '1' || s[i] == '?')
t1++;
}
else
if(s[i] == '1') t2++;
int ok = (s.size() - i - 1) / 2;
if((s.size() - i - 1) % 2 == 1) ok++;
if(t1 > ok + t2) {
pos = min(pos, i + 1);
break;
}
}
t1 = 0; t2 = 0;
for(int i = 0; i < s.size(); i++) {
if(i % 2 == 0) {
if(s[i] == '1') t1++;
}
else
if(s[i] == '?' || s[i] == '1') t2++;
int ok = (s.size() - i - 1) / 2;
if(t2 > ok + t1) {
pos = min(pos, i + 1);
break;
}
}
cout << pos << endl;
return ;
}
signed main() {
int t; cin >> t;
while(t--) {
solve();
}
return 0;
}
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 10;
inline void solve() {
string s, t; cin >> s >> t;
s = ' ' + s; t = ' ' + t;
int n = s.size(), m = t.size();
int i = 1, j = 1, f = 0;
for(; i <= n; i ++) {
if((i & 1) == f && s[i] == t[j]) {
j++; f ^= 1;
}
if(j == m + 1) {
puts("yes");
return ;
}
}
i = 1; j = 1; f = 1;
for(; i <= n; i ++) {
if((i & 1) == f && s[i] == t[j]) {
j++; f ^= 1;
}
if(j == m + 1) {
puts("yes");
return ;
}
}
puts("no");
return ;
}
signed main() {
int t; scanf("%lld", &t);
while(t--) solve();
return 0;
}