问题A: Carryless Square Root
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 10010;
int n,a[40],as[40],d[40],l[99];
char s[40];
bool vis[1010];
void dfs(int nd) {
if(nd==n) {
memset(d,0,sizeof(d));
for(int j=0; j<nd; j++) {
for(int k=0; k<nd; k++) {
d[j+k] += (as[j]*as[k]);
d[j+k] %= 10;
}
}
for(int i=0; i<2*nd-1; i++)
if(d[i]!=a[i]) return ;
for(int i=0; i<n; i++){
if(i==n-1) printf("%d\n",as[n-1]);
else printf("%d",as[i]);
}
exit(0);
}
else {
for(int i=0; i<=9; i++) {
as[nd] = i;
memset(d,0,sizeof(d));
for(int j=0; j<=nd; j++) {
for(int k=0; k<=nd; k++) {
if(j+k>nd) break;
d[j+k] += (as[j]*as[k]);
d[j+k] %= 10;
}
}
int f=0;
for(int i=0; i<=nd; i++)
if(d[i]!=a[i]) f=1;
if(!f) dfs(nd+1);
}
}
}
int main()
{
scanf("%s",s);
int l = strlen(s);
for(int i=0; i<l; i++)
a[i]=s[i]-'0';
if(a[l-1]=='2'||a[l-1]=='3'||a[l-1]=='7'||a[l-1]=='8')
cout << "-1" << endl;
else if(a[0]=='2'||a[0]=='3'||a[0]=='7'||a[0]=='8')
cout << "-1" << endl;
else if(!l&1)
cout << "-1" << endl;
else if(a[0]==1&&a[1]==5)
cout << "-1" << endl;
else {
n = (l+1)/2;
dfs(0);
cout << "-1" << endl;
}
return 0;
}
问题D: Swap Free
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
using namespace std;
vector<int> ma[1010];
char M[550][30];
int n,l[1010];
bool vis[1010];
bool dfs(int x) {
int len = ma[x].size()-1;
for(int i=0; i<=len; i++) {
int v = ma[x][i];
if(vis[v]) continue;
vis[v] = 1;
if(!l[v] || dfs(l[v])){
l[v] = x;
l[x] = v;
return 1;
}
}
return 0;
}
int so(int n) {
int ans = 0;
for(int i=1; i<=n; i++) {
if(l[i]) continue;
for(int j=1; j<=n; j++) vis[j] = 0;
if(dfs(i)) ans++;
}
return n-ans;
}
int main()
{
scanf("%d",&n);
getchar();
for(int i=1; i<=n; i++) gets(M[i]);
int len = strlen(M[1]);
for(register int i=1; i<=n; i++) {
for(register int j=i+1; j<=n; j++) {
int sum = 0;
for(register int k=0; k<len; k++) {
if(M[i][k]!=M[j][k]) {
sum++;
if(sum>2) break;
}
}
if(sum == 2) {
ma[i].pb(j);
ma[j].pb(i);
}
}
}
printf("%d\n",so(n));
return 0;
}
问题H: Levenshtein Distance
#include <bits/stdc++.h>
#define ll long long
#include <set>
using namespace std;
set<string> s;
string a,b;
void work(string a,string b)
{
string tmp;
//插入的情况
for(int i=0; i<=b.size(); i++)
{
for(auto k: a)
{
tmp.clear();
int t=0;
for(int j=0; j<b.size(); j++)
{
if(j==i)
{
tmp.push_back(k);
tmp.push_back(b[j]);
}
else tmp.push_back(b[j]);
}
if(i==b.size()) tmp.push_back(k);
s.insert(tmp);
}
}
//删除
for(int i=0; i<b.size(); i++)
{
tmp.clear();
for(int j=0; j<b.size(); j++)
{
if(j==i) continue;
else tmp.push_back(b[j]);
}
s.insert(tmp);
}
//替换
for(int i=0; i<b.size(); i++)
{
for(auto k: a)
{
tmp.clear();
for(int j=0; j<b.size(); j++)
{
if(j==i) tmp.push_back(k);
else tmp.push_back(b[j]);
}
s.insert(tmp);
}
}
}
int main()
{
cin >> a >> b;
work(a,b);
for(auto p: s)
if(p!=b) cout << p << endl;
return 0;
}
int main()
{
cin >> a >> b;
work(a,b);
for(auto p: s)
if(p!=b) cout << p << endl;
return 0;
}
问题L: Balanced Animals
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5;
int a[N+100],sum[N+10];
int main()
{
int n,w,maxn=0,minn=1e6;cin>>n;
for(int i=1; i<=n; i++) {
cin>>w;
a[w]++;
if(w>maxn) maxn=w;
if(w<minn) minn=w;
}
for(int i=minn; i<=maxn; i++)
sum[i] += sum[i-1]+i*a[i];
for(int i=1; i<=maxn; i++) {
if(sum[i-1]==sum[maxn]-sum[i]) {
cout<<i<<endl;
break;
}
}
return 0;
}
问题M: From A to B
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int dfs(int a,int b,int t)
{
if(a<b) {
t+=b-a;
return t;
}
if(a==b) return t;
if(a>b) {
if(a%2==1) dfs(a+1,b,t+1);
else dfs(a/2,b,t+1);
}
}
int main()
{
int a,b,res=0;
cin>>a>>b;
if(a==b) res=0;
else if(a<b) res=b-a;
else if(a>b) res=dfs(a,b,0);
cout << res << endl;
return 0;
}
问题N: Even or Odd
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
int n;
cin>>n;
if(n==1)
{
cout<<1<<endl;
return 0;
}
if(n&1)
{
cout<<0<<endl;
}
else
{
n/=2;
if(n&1) cout<<1<<endl;
else cout<<2<<endl;
}
return 0;
}