A:成绩转换
B:平方和与立方和
C:破译密码
D:最大连续子序列
E:安全路径
http://39.106.164.46/problem.php?id=1005
思路:
白给题目。
AC代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX 1005
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
int n;
int main(){
while(cin>>n){
if(n>=108&&n<=120){
cout<<"A"<<endl;
}else if(n>=100&&n<=107){
cout<<"B"<<endl;
}else if(n>=80&&n<=99){
cout<<"C"<<endl;
}else if(n>=72&&n<=79){
cout<<"D"<<endl;
}else if(n>=0&&n<=71){
cout<<"E"<<endl;
}else{
cout<<"Score is error!"<<endl;
}
}
return 0;
}
http://39.106.164.46/problem.php?id=1006
思路:
注意进行强制转换,否则会溢出。
AC代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX 1005
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
int n,m;
int main(){
while(cin>>n>>m){
if(n>m){
int tmp=n;
n=m;
m=tmp;
}
ll sum1=0,sum2=0;
for(int i=n;i<=m;i++){
if(i%2==0) sum1+=(ll)i*i; //要进行强制转换!
else sum2+=(ll)i*i*i;
}
cout<<sum1<<" "<<sum2<<endl;
}
return 0;
}
http://39.106.164.46/problem.php?id=1007
思路:
简单字符串处理。
AC代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX 1005
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
string s,res;
int main(){
while(getline(cin,s)){
if(s=="ENDOFINPUT") break;
if(s!="START"&&s!="END"){
res="";
for(int i=0;i<s.length();i++){
if(s[i]>='A'&&s[i]<='Z'){
if(s[i]>='A'&&s[i]<='E'){
char tmp='Z'-(5-(s[i]-'A'))+1;
res=res+tmp;
}else{
char tmp=s[i]-5;
res=res+tmp;
}
}else{
res=res+s[i];
}
}
}
if(s=="END") cout<<res<<endl;
}
return 0;
}
http://39.106.164.46/problem.php?id=1008
思路:
最大连续子序列模板题。
可以参考:
https://blog.csdn.net/weixin_44123362/article/details/95936697
AC代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX 100005
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
int n,a[MAX],s[MAX],dp[MAX];
int main(){
while(scanf("%d",&n)!=EOF){
memset(s,0,sizeof(s));
memset(a,0,sizeof(a));
memset(dp,0,sizeof(dp));
bool flag=false;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
if(a[i]>=0) flag=true;
}
if(flag==false){
printf("0 0 0\n");
continue;
}
dp[0]=a[0];
for(int i=1;i<n;i++){
if(dp[i-1]+a[i]>a[i]){
dp[i]=dp[i-1]+a[i];
s[i]=s[i-1];
}else{
dp[i]=a[i];
s[i]=i;
}
}
int k=0;
for(int i=1;i<n;i++){
if(dp[i]>dp[k]){
k=i;
}
}
printf("%d %d %d\n",dp[k],s[k],k);
}
return 0;
}
http://39.106.164.46/problem.php?id=1009
思路:
由于n最大为1000,用floyd可能会超时,使用dijkstra即可。
注意把加变成乘就好了。
AC代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX 1005
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
int n,m,vis[MAX];
double mp[MAX][MAX],dis[MAX];
void dijkstra(int s){
memset(vis,0,sizeof(vis));
memset(dis,0,sizeof(dis));
dis[s]=1;
for(int i=0;i<n;i++){
int u=-1;
double maxl=0;
for(int j=1;j<=n;j++){
if(vis[j]==0&&dis[j]>maxl){
u=j;
maxl=dis[j];
}
}
if(u==-1) break;
vis[u]=1;
for(int v=1;v<=n;v++){
if(vis[v]==0&&mp[u][v]!=0){
if(dis[u]*mp[u][v]>dis[v]){
dis[v]=dis[u]*mp[u][v];
}
}
}
}
}
int main(){
while(scanf("%d",&n)!=EOF){
memset(mp,0,sizeof(mp));
double len;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%lf",&len);
mp[i][j]=len;
}
}
scanf("%d",&m);
int s,t;
for(int i=0;i<m;i++){
scanf("%d %d",&s,&t);
dijkstra(s);
if(dis[t]==0) printf("What a pity!\n");
else printf("%.3f\n",dis[t]);
}
}
return 0;
}