A+B for Polynomials
#include<bits/stdc++.h>
using namespace std;
const int N=2005;
double A[N],B[N],C[N];//C为结果数组
//同指数,指数不变,系数相加,即C[i]+=A[i]+B[i]
int main() {
std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int n,m;
int x; double y;
cin>>n; for (int i=0; i<n; i++) cin>>x>>y, A[x]+=y;
cin>>m; for (int i=0; i<m; i++) cin>>x>>y, B[x]+=y;
for (int i=0; i<N; i++) C[i]=A[i]+B[i];
int cnt=0;
for (int i=0; i<N; i++) if (C[i]) cnt++;
cout<<cnt;
for (int i=N-1; i>=0; i--) if (C[i]){
printf(" %d %.1f", i, C[i]);
}
return 0;
}
Product of Polynomials
注:系数大的在前,小的在后
#include<bits/stdc++.h>
using namespace std;
const int N=2005;
double A[N],B[N],C[N];//C为结果数组
//指数相加,系数相乘,即C[i+j]+=A[i]*B[j]
int main() {
std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int n,m;
int x; double y;
cin>>n; for (int i=0; i<n; i++) cin>>x>>y, A[x]+=y;
cin>>m; for (int i=0; i<m; i++) cin>>x>>y, B[x]+=y;
for (int i=0; i<=1000; i++)
for (int j=0; j<=1000; j++) if (A[i]&&B[j]) {
C[i+j]+=A[i]*B[j];
}
int cnt=0;
for (int i=0; i<N; i++) if (C[i])
cnt++;
cout << cnt;
for (int i=N; i>=0; i--) if (C[i]) {
printf(" %d %.1f", i, C[i]);
}
return 0;
}
Shuffling Machine
洗牌
void *memcpy(void *destin, void *source, unsigned n);
#include<bits/stdc++.h>
using namespace std;
const int N=55;
int A[N], B[N], C[N];
int main() {
int k; cin>>k;
for (int i=1; i<N; i++) A[i]=i-1; //第一行(0~13)在m数组中的下标全都是0(x/13=0,x∈[0,12]),所以要i-1,i∈[1,N)
int x, p=1;
while (~scanf("%d", &x)) C[p++]=x;
for (int i=0; i<k; i++) {
for (int j=1; j<p; j++) {
B[C[j]]=A[j];
}
memcpy(A, B, sizeof A);
}
char m[5]={'S', 'H', 'C', 'D', 'J'};
printf("%c%d", m[A[1]/13], A[1]%13+1);
for (int i=2; i<p; i++) {
printf(" %c%d", m[A[i]/13], A[i]%13+1);
}
return 0;
}
Shortest Distance
破换成链+前缀和
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
int main() {
std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int n; cin>>n;
ll s[N];
for (int i=1; i<=n; i++) cin>>s[i], s[i+n]=s[i];
for (int i=0; i<2*n; i++) s[i+1]+=s[i];
int m,a,b; cin>>m;
for (int i=0; i<m; i++) {
if (i) cout<<'\n';
cin>>a>>b;
if (a>b) swap(a,b);
a--, b--;
cout << min(s[b]-s[a], s[a+n]-s[b]);
}
return 0;
}
Spiral Matrix
题目大意:给一个序列,将其放入一个R减C的值尽量小的矩阵中,且R≥C(要求螺旋式地降序放入)
21/25分代码,有两个样例过不了...
#include<bits/stdc++.h>
using namespace std;
bool cmp(const int a, const int b){
return a>b;
}
int main() {
std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int N; cin>>N;
int A[N+5]; for (int i=1; i<=N; i++) cin>>A[i];
int n,m;
for (int i=sqrt(N); i>0; i--) if (N%i==0) {
m=i, n=N/i;
break;
}
sort(A+1, A+N+1, cmp);
int c=1, i=0, j=-1, g[n+5][m+5], st[n+5][m+5]; memset(st, false, sizeof st);
while (c<N) {
while (j+1<m && !st[i][j+1]) g[i][++j]=A[c++], st[i][j]=1;
while (i+1<n && !st[i+1][j]) g[++i][j]=A[c++], st[i][j]=1;
while (j>0 && !st[i][j-1]) g[i][--j]=A[c++], st[i][j]=1;
while (i>0 && !st[i-1][j]) g[--i][j]=A[c++], st[i][j]=1;
}
for (int i=0; i<n; i++) {
for (int j=0; j<m; j++) {
if (j==m-1) cout << g[i][j];
else cout<<g[i][j]<<' ';
}
if (i!=n-1)
cout<<'\n';
}
return 0;
}
The Black Hole of Numbers
给定数字 N 如果不足四位,则补充前导 0 至四位为止。
输出格式
如果 N 的四位数字都相同,则输出一行 N - N = 0000。
否则,每行输出一个操作步骤,直到出现 6174 作为差值产生为止。
思路
do while+补全
//字符串数字互转(浮点数也可)
string s= "123.32";
stringstream ss;
ss<<s;
ss>>a;
#include<bits/stdc++.h>
using namespace std;
void complete(string& s) {
if (s.size()==4) return;
int d=4-s.size();
for (int i=0; i<d; i++) s="0"+s;
}
int main() {
int n; scanf("%d", &n);
string s=to_string(n), zero="0000";
complete(s);
do {
string a=s, b=s;
sort(a.rbegin(), a.rend()), sort(b.begin(), b.end());
if (a==b) {
printf("%s - %s = %s\n", a.c_str(), b.c_str(), zero.c_str());
break;
}
n=stoi(a)-stoi(b);
s=to_string(n);
complete(s);
printf("%s - %s = %s\n", a.c_str(), b.c_str(), s.c_str());
} while (n!=6174);
return 0;
}