A:
代码:
对于一个较大的整数 N(1<=N<=2,000,000,000)
比如 980364535,我们常常需要一位一位数这个数字是几位数,但是如果在这 个数字每三位加一个逗号,它会变得更加易于朗读。
因此,这个数字加上逗号成如下的模样:980,364,535请写一个程序帮她完成这件事情
代码:
#include<iostream>
#include<stdio.h>
using namespace std;
const int inf=0x3f3f3f3f;
int main()
{
long long n;
int lala;
int m[50];
while(cin>>n)
{
if(n<100)
cout<<n<<endl;
else
{lala=1;
while(n>0)
{
m[lala]=n%10;
n=n/10;
lala++;
}
lala--;
int f=lala%3;
// cout<<lala<<endl;
if(f==1)
{
cout<<m[lala]<<",";
lala=lala-1;
}
else if(f==2)
{
cout<<m[lala]<<m[lala-1]<<",";
lala=lala-2;
}
int num=0;
for(int i=lala;i>=1;i--)
{
cout<<m[i];
num=num+1;
if(num==3&&i!=1)
{
cout<<",";
num=0;
}
}
cout<<endl;
}
}
return 0;
}
C:水题,结构体排序
在ACM竞赛中,当遇到有两个队伍(人) 解出相同的题目数量的时候,我们需要通过他们解决问题的总时间进行排序。
一共有 N(1<=N<=5,000)条时间被以时(0<=Hours<=99), 分(0<=Minutes<=59),秒(0<=Seconds<=59)的形式记录。
你必须要把他们按时,分,秒排序为 升序,最少的时间最先。 考虑到如下的样例,这三个解出相同题目数量的时间为
11:20:20
11:15:12
14:20:14
正确的排序结果应该是这样的:
11:15:12
11:20:20
14:20:14
代码:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
struct node
{
int a,b,c;
bool operator <(const node &other)const //降序排序
{
if(a!=other.a)
return a<other.a;
if(b!=other.b)
return b<other.b;
return c<other.c;
}
}lala[5500];
int main()
{
int t;
cin>>t;
for(int i=1;i<=t;i++)
{
cin>>lala[i].a>>lala[i].b>>lala[i].c;
}
sort(lala+1,lala+t+1);
for(int i=1;i<=t;i++)
{
cout<<lala[i].a<<" "<<lala[i].b<<" "<<lala[i].c<<endl;
}
return 0;
}
J:百度,打表
输入一个数n,求n个碳的烷烃(仅由碳、
氢、碳碳单键与碳氢单键所构成)的同分异构体的数目n=3,4,5如下图所示
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
int main()
{
int n;
int a[10];
a[3]=1;
a[4]=2;
a[5]=3;
a[6]=5;
a[7]=9;
a[8]=18;
a[9]=35;
while(cin>>n)
{
if(n==0||n==1||n==2)
cout<<1<<endl;
else
{
cout<<a[n]<<endl;
}
}
return 0;
}
B:数学题
萌新AA喜欢对称,最近她喜欢把棋子放进她的棋盘中,这个棋盘是由 N×M 个格 子构成的(1 <= N <= 1,000,000,000;1<=M<=1,000,000,000) 为了保证对称,AA 会以这样的方式摆放她的棋子。她把棋子放在棋盘正中央的方格内, 如果不存在这样的方格,她就会停止。然后她以这个方格为中心把棋盘分成四部分,然后对于每 个小棋盘进行上述的操作。 下面是一个 N=7,M=15 的例子,其中'C'表示棋子
这样子,需要 21个棋子。如果 N=M=5 的话,AA只需要摆放一个棋子,因为分成的四 个小棋盘分别是 2×2 的大小,无法在放进去新的棋子。现在,请你帮助 AA来计算,需要 多少个棋子。
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<cmath>
using namespace std;
const int inf=0x3f3f3f3f;
int main()
{
long long n,m;
int logal;
int num;
int hahaha;
while(cin>>n>>m)
{
int logal=0;
if(n%2==1&&m%2==1)
{
num=1;
while(1)
{
logal+=2;
n=(n-1)/2;
m=(m-1)/2;
// cout<<n<<" "<<m<<endl;
if(n%2==0||m%2==0)
break;
if(n==1&&m==1)
num+=pow(2,logal);
else if(n==1&&m%2==1)
num+=pow(2,logal);
else if(n%2==1&&m%2==1)
num+=pow(2,logal);
//cout<<"num:"<<num<<endl;
}
}
else
num=0;
cout<<num<<endl;
}
}
E:数学题
已知有一个n+1个数的数列,对于给定的A
0和A
n ,当i满足当1<=i<=n-1时有
现在小星想知道对于这个数列一段区间的和。
代码:
#include<iostream>
using namespace std;
int main()
{
long long n,A0,An,Q;
long long xpp1;
long long xpp2;
long long l,r;
cin>>n>>A0>>An>>Q;
while(Q--)
{
cin>>l>>r;
xpp1=A0+(An-A0)*l/n;
xpp2=A0+(An-A0)*r/n;
cout<<(xpp1+xpp2)*(r-l+1)/2<<endl;
//cout<<(long long)((xpp1+xpp2)*((r-l+1)*1.0/2.0))<<endl;
}
return 0;
}
D:常州大学组织了
新生寒假训练一共N天,每天训练可以获得的训练效果是Ei。但是如果连续训练超过K天,萌新们会受不了而被劝退。
现在负责人想知道,如何安排能保证萌新不会被劝退并且能获得最大的训练效果。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int n, k, h = 1, t = 0;
long long ans = 0;
long long dp[100007];
long long e[100007];
int q[100007];
int main()
{
cin >> n >> k;
for (int i = 1; i <= n; ++i)
{
cin >> e[i];
e[i] += e[i - 1];
}
q[++t] = 0;
for (int i = 1; i <= n + 1; ++i)
{
while (h<t&&i - q[h]>k + 1) h++;
dp[i] = max(dp[i], dp[q[h]] + e[i - 1] - e[q[h]]);
ans = max(ans, dp[i]);
while (h <= t&&dp[q[t]] - e[q[t]] <= dp[i] - e[i]) t--; q[++t] = i;
}
cout << ans << endl;
}