A题.
第一题就因为看错WA了一次
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cassert>
#include <climits>
#include <cfloat>
#include <cctype>
#include <stdio.h>
#include <string.h>
using namespace std;
//#define max(a,b) ((a)>(b)?(a):(b))
int main()
{
char x[505],y[505];
char a[505][505],b[505][505];
int lenx,leny;
int ans[505][505];
while(scanf("%s %s",x,y)!=EOF)
{
lenx=strlen(x);
leny=strlen(y);
for(int i=0;i<=lenx;i++){
ans[i][leny]=0;
}
for(int j=0;j<=leny;j++){
ans[lenx][j]=0;
}
for(int i=lenx-1;i>=0;i--){
for(int j=leny-1;j>=0;j--){
if(x[i]!=y[j]){ans[i][j]=max(ans[i+1][j],ans[i][j+1]);}
if(x[i]==y[j]){ans[i][j]=ans[i+1][j+1]+1;}
}
}
cout<<ans[0][0]<<endl;
}
return 0;
}
B题.
这个是古董题了,奶牛比赛变宇宙飞船2333
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cassert>
#include <climits>
#include <cfloat>
#include <cctype>
#include <stdio.h>
#include <string.h>
using namespace std;
const int maxn =100002;
int visited[maxn];
struct step
{
int x;
int steps;
step(int xx,int ss):x(xx),steps(ss){};
};
queue <step>q;
int main()
{
int n,k;
cin>>n>>k;
memset(visited,0,sizeof(visited));
visited[n]=1;
q.push(step(n,0));
while(!q.empty())
{
step s=q.front();
if(s.x==k)
{
cout<<s.steps<<endl;
return 0;
}
else
{
if(s.x-1>=0&&!visited[s.x-1])
{
q.push(step(s.x-1,s.steps+1));
visited[s.x-1]=1;
}
if(s.x+1<=maxn&&!visited[s.x+1])
{
q.push(step(s.x+1,s.steps+1));
visited[s.x+1]=1;
}
if(s.x*2<=maxn&&!visited[s.x*2])
{
q.push(step(s.x*2,s.steps+1));
visited[s.x*2]=1;
}
q.pop();
}
}
return 0;
}
C题.
签到题
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cassert>
#include <climits>
#include <cfloat>
#include <cctype>
#include <stdio.h>
#include <string.h>
using namespace std;
//#define max(a,b) ((a)>(b)?(a):(b))
int main()
{
int a[5];
for(int i=1;i<=4;i++)
{
cin>>a[i];
}
if(a[1]!=a[4])cout<<0<<endl;
else if(a[1]==0&&a[3]!=0)cout<<0<<endl;
else cout<<1<<endl;
return 0;
}
D题.
最开始没想用三分,想直接求平方和的最小值,好像平方和取最小值时绝对值和也最小啊,结果WA了5555,被迫三分。
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n,x[15005],p[15005];
double nu=0,de=0,l=0,r=50000;//分子 分母
double me,mi,ans=0;
double a,b,s,tmp;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d %d",&x[i],&p[i]);
}
//int k=0;
while (l + 0.000001 < r)
{
//if(n>=k)de+=p[k];
me=(l + r) / 2;
//if(n>=k)nu+=x[k]*p[k];
mi= (me + r) / 2;
s=0;tmp=0;
for (int i =0;i<n;i++)
s+=p[i]*((x[i]>me)?x[i]-me:me-x[i]);
tmp=s;
s=0;
for (int i = 0; i < n; i++)
s+=p[i]*((x[i]>mi)?x[i]-mi:mi-x[i]);
if (tmp<s)r = mi;
else l = me;
//k++;
}
ans=me;
printf("%.5lf",ans);
return 0;
}
E题.
这题做过
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cassert>
#include <climits>
#include <cfloat>
#include <cctype>
#include<stdio.h>
#include<string.h>
#include<math.h>
#define MAX 0x3f3f3f3f
using namespace std;
double cmap[101][101];
/*
3
12.345 23.456 34.567 1.234
1.234 2.345 3.456 2.345
4.321 5.432 6.543 3.456
*/
int main()
{
int n,k;
double x[101],y[101],z[101],r[101],m;
int vis[101];
while (scanf("%d",&n)==1&&n)
{
for (int i=0;i<n;i++)
scanf("%lf %lf %lf %lf",&x[i],&y[i],&z[i],&r[i]);
double t;
for (int i=0;i<n;i++)
{
cmap[i][i]=0.000;
for (int j=i+1;j<n;j++)
{
t=sqrt(pow((x[i]-x[j]),2)+pow((y[i]-y[j]),2)+pow((z[i]-z[j]),2));
cmap[i][j]=t-r[i]-r[j];
if (cmap[i][j]<1e-8) cmap[i][j]=0.000;
cmap[j][i]=cmap[i][j];
}
}
double d[101];
for (int i=0;i<n;i++)
{
d[i]=cmap[0][i];
vis[i]=0;
}
vis[0]=1;
int st;
for (k=0;k<n-1;k++)
{
m=MAX;
st=-1;
for (int i=1;i<n;i++)
if (!vis[i]&&d[i]<m)
{
m=d[i];
st=i;
}
if (st==-1) break;
vis[st]=1;
for (int i=1;i<n;i++)
if (!vis[i]&&cmap[st][i]<d[i])
d[i]=cmap[st][i];
}
double ans=0;
for (int i=0;i<n;i++)
{
ans+=d[i];
}
printf("%.3lf\n",ans);
}
}
F题.
最初尝试暴力求解结果直接GG,果然不会那么简单
这是TLE的代码
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <stdio.h>
#include <string.h>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cassert>
#include <climits>
#include <cfloat>
#include <cctype>
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
int yue(int m,int n){
if(m%n == 0)
return n;
else
return yue(n,m%n);
}
int main()
{
int m,n;
int x,y;
int ans;
scanf("%d",&m);
for(int k=1;k<=m;k++)
{
ans=0;
scanf("%d",&n);
for(int i=1;i<=n-1;i++)
for(int j=i+1;j<=n;j++)
{
x=0;y=0;
x=i^j;y=j-i;
if(y==x)if(y==yue(j,i))ans++;
}
printf("Case %d: %d\n",k,ans);
}
return 0;
}
过了的代码
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <stdio.h>
#include <string.h>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cassert>
#include <climits>
#include <cfloat>
#include <cctype>
using namespace std;
#define MAX 30000005
int yue(int m,int n){
if(m%n == 0)
return n;
else
return yue(n,m%n);
}
int ans[MAX];
int vis[MAX];
int main()
{
int m,n;
int x,y;
//int ans[MAX];这个不能放main函数里,唉又忘了
for(int i=0;i<MAX;i++){
ans[i]=0;
}
for(int i=0;i<MAX;i++){
vis[i]=1;
}
for(int i=1;i<MAX/2;i++){
for(int j=2*i;j<MAX;j+=i){
int yi=j^i;
if((j-i)==yi)ans[j]++;
}
}
for(int i=1;i<MAX;i++)
ans[i]=ans[i]+ans[i-1];
scanf("%d",&m);
for(int k=1;k<=m;k++){
scanf("%d",&n);
printf("Case %d: %d\n",k,ans[n]);
}
return 0;
}
G题.
#include<iostream>
using namespace std;
bool findchar(const string& st, char* ch, int* cnt, bool issensitive=true){
bool ret = true;
int table[52] = {0};
int max = 0, maxindex =0, index = -1;
if(st.length() <= 0)
return false;
string str = st;
for(unsigned int i=0; i<str.length(); i++) {
if((str.at(i) <= 'Z') && (str.at(i) >= 'A') ) {
index = static_cast<int>( str.at(i) - 'A');
table[index]++;
}
else if((str.at(i) <= 'z') && (str.at(i) >= 'a')){
index = static_cast<int>(str.at(i) - 'a') ;
index += 26;
table[index]++;
}
}
if(issensitive) {
for(int i=0; i<52;i++) {
if(max < table[i]){
max = table[i];
maxindex = i;
}
}
}
else{
for(int i=0; i<26;i++) {
table[i] = table[i] + table[i+26];
table[i+26] = 0;
}
for(int j=0; j<26; j++) {
if(max < table[j]) {
max = table[j];
}
}
for(unsigned int i=0; i<str.length();i++) {
int cnt = -1;
(str.at(i) > 'Z') ? (cnt = static_cast<int>(str.at(i) - 'a')) : \
( cnt = static_cast<int>(str.at(i) - 'A') );
if(table[cnt] == max){
(str.at(i) > 'Z') ? (maxindex = 26 + cnt ) : (maxindex = cnt);
break;
}
}
}
if((maxindex < 26) && (max>1) ) {
*ch = maxindex + 'A';
*cnt = max;
}
else if((maxindex >= 26) && (max>1) ) {
*ch = maxindex + 'a' - 26;
*cnt = max;
}
else if(max==1){
*ch = str.at(0);
*cnt = max;
}
return ret;
}
int main()
{
char ch = 0;
int cnt = 0;
string str = "SssssMaammmmmmmaAde";
if(findchar(str, &ch, &cnt, false))
cout << "ch: " << ch << " cnt: " << cnt << endl;
else
cout << "failed" << endl;
}
H题.
和之前的题目一样的,换成神犇了2333,就这样吧,这个方法其实一点也不好
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <stdio.h>
#include <string.h>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cassert>
#include <climits>
#include <cfloat>
#include <cctype>
using namespace std;
#define MAX 100000
class csum {
public:
int lsum,rsum;
int msum,sum;
};
csum tree[4*MAX+1];
int sums[MAX +1],array[MAX+1];
void update(int node, int pos, int val, int a, int b ) {
if (a==b&&a==pos)
{
tree[node]=((csum){val,val,val,val});
return;
}
else if (pos<=(a+b)/2)
{
update(node*2,pos,val,a,(a+b)/2);
}
else if (pos>(a+b)/2)
{
update(node*2+1,pos,val,(a+b)/2+1,b);
}
csum left=tree[node*2 ],right=tree[node*2+1];
tree[node] = ((csum){
max(left.lsum,left.sum+right.lsum ),
max(right.rsum,right.sum+left.rsum ),
max(left.msum, max(right.msum,right.lsum+left.rsum)),
left.sum + right.sum });
}
void next(int node, int pos, int val, int a, int b ) {
csum left=tree[node*2 ],right=tree[node*2+1];
tree[node] = ((csum){
max(left.lsum,left.sum+right.lsum ),
max(right.rsum,right.sum+left.rsum ),
max(left.msum, max(right.msum,right.lsum+left.rsum)),
left.sum + right.sum });
}
csum query( int node, int a, int b, int i, int j ){
if (i==a&&j==b){
return tree[node];
}
if (j<=(a+b)/2){
return query(node*2,a,(a+b)/2,i,j);
}
if (i>(a+b)/2){
return query(node*2+1,(a+b)/2+1,b,i,j);
}
csum left=query(node*2,a,(a+b)/2,i,(a+b) / 2 );
csum right=query(node*2+1,(a+b)/2+1,b,(a+b)/2+1,j);
return ((csum){
max(left.lsum,left.sum+right.lsum),
max(right.rsum,right.sum+left.rsum),
max(left.msum,max(right.msum,right.lsum+left.rsum)),
left.sum + right.sum});
}
void init(int node,int i,int j )
{
if (i==j){
tree[node]=((csum){array[i],array[i],array[i],array[i]});
}
else {
init(node*2,i,(i+j)/2);
init(node*2+1,(i+j)/2+1,j);
csum left = tree[ node*2], right=tree[ node*2 +1];
tree[node].lsum = max( left.lsum,left.sum+right.lsum );
tree[node].rsum = max( right.rsum,right.sum+left.rsum );
tree[node].msum=max( left.msum,max(right.msum,left.rsum+right.lsum ) );
tree[node].sum=left.sum+right.sum;
}
}
int main()
{
int i,N,q,op,l,r;
scanf("%d",&N);
for (i=0;i<N;++i)scanf("%d",array+i);
init(1,0,N-1);
scanf("%d",&q);
for ( i = 0; i < q; ++i ){
scanf("%d%d%d",&op,&l,&r);
if (op==0)update(1,l-1,r,0,N-1);
else printf("%d\n", query(1,0,N-1,l-1,r-1).msum);
}
return 0;
}