目录
完美的代价:
思路:
采用局部最优解思路(又称贪心思想),从尾部寻找能与头部元素能匹配的第一个,然后直接移动到最后,使得这两个字母对称,以此类推
代码:
#include<iostream>
#include<string>
using namespace std;
int n;
string s;
int ans,flag;
int main(){
cin>>n>>s;
for(int i=0;i<n;i++){
for(int j=n-1;j>=i;j--){
if(j==i){
if(s.size()%2==0||flag==1){
cout<<"Impossible"<<endl;
system("pause");
return 0;
}
flag++;
ans+=s.size()/2-i;
}
else if(s[i]==s[j]){
for(int k=j;k<n-1;k++)
swap(s[k],s[k+1]);
ans+=n-j-1;
n--;
break;
}
}
}
cout<<ans;
system("pause");
return 0;
}
矩形面积交:
思路:
利用交集性质直接求解即可,即最小值大于最大值并且最大值大于最小值
代码:
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
#define INF 0x3f3f3f
double mx1=INF,my1=INF,ax1,ay1;
double mx2=INF,my2=INF,ax2,ay2;
vector<double>res,ans;
int main(){
for(int i=0;i<2;i++){
double a,b;
cin>>a>>b;
mx1=min(mx1,a);
my1=min(my1,b);
ax1=max(ax1,a);
ay1=max(ay1,b);
}
for(int i=0;i<2;i++){
double a,b;
cin>>a>>b;
mx2=min(mx2,a);
my2=min(my2,b);
ax2=max(ax2,a);
ay2=max(ay2,b);
}
if((mx2<=ax1&&my2<=ay1)&&(ax2>=mx1&&ay2>=my1)){
double a1,b1,a2,b2;
a1=max(mx2,mx1);
b1=max(my2,my1);
a2=min(ax1,ax2);
b2=min(ay1,ay2);
printf("%.2lf",(a2-a1)*(b2-b1));
}
else
cout<<"0.00";
system("pause");
return 0;
}
矩阵乘法:
思路;
利用矩阵的性质相乘即可,三层循环相乘,因为每一层需要计算n次,顺便对0次阶特判一下即可
代码:
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
#define INF 0x3f3f3f
const int N=35;
vector<vector<int> >res(N,vector<int>(N)),mp(N,vector<int>(N));
vector<int>t;
int n,m;
int main(){
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
int num;
cin>>num;
res[i][j]=mp[i][j]=num;
}
}
if(m>0){
m--;
while(m--){
for(int k=0;k<n;k++){
for(int i=0;i<n;i++){
int sum=0;
for(int j=0;j<n;j++){
sum+=res[k][j]*mp[j][i];
}
t.push_back(sum);
}
for(int i=0;i<n;i++)
res[k][i]=t[i];
t.clear();
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cout<<res[i][j]<<' ';
}
cout<<endl;
}
}
else{
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i==j)
cout<<1<<' ';
else
cout<<0<<' ';
}
cout<<endl;
}
}
system("pause");
return 0;
}
分解质因数:
原题链接:
思路:
本题数量级1e4,暴力求解即可,质因数的常规求解
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
int a,b;
void test(int x){
cout<<x<<'=';
for(int i=2;i<x;i++){
while(x){
if(x%i==0){
x/=i;
cout<<i;
if(x!=1)
cout<<'*';
}
else
break;
}
}
if(x!=1)
cout<<x<<endl;
else
cout<<endl;
}
int main(){
cin>>a>>b;
for(int i=a;i<=b;i++){
test(i);
}
system("pause");
}
时间转换:
原题链接:
代码:
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
int t;
int H,M,S;
int main(){
cin>>t;
while(1){
if((int)(t/3600)>0){
H++;
t-=3600;
}
else
break;
}
while(2){
if((int)(t/60)>0){
M++;
t-=60;
}
else
break;
}
cout<<H<<':'<<M<<':'<<t;
system("pause");
}