Fuduforces Round #1(FD2-8)题解

**

A - A == B ? HDU - 2054

**
思路:
题干给的信息不是很多,但是我第一时间对可能的坑的反应就是:1、没说明数字的范围,那么最好用字符串防止爆long long;2、可能会有小数点陷阱,即下面样例示意的;3、可能会有多个零,所以必须要多次判断多次清除无效0,推荐用while;4、输出的YES、NO应该注意大小写防止PE。

样例的数据往往存在挖坑误导的嫌疑,虽然是一个简单的A == B,但是你得考虑如下几种测试样例:

  1. 1.0 == 1.000000000000000001 ?
  2. 0.0 = 0 ?
  3. 1000 = 100 ?
  4. 0001 == 01 ?
  5. 1.0 = 1 ?
  6. 010.001 = 10.001000 ?

代码:

群友贡献(判断标准:1、运行时间最短 2、如果运行时间相等,选择空间小的 3、如果空间也等,则看代码的长度):

在这里插入图片描述

C++:

#include <cstdio>
#include <cstring>
char a[100017], b[100017];
void re(char s[])
{
	int len = strlen(s);
	int p = 0;
	for (int i = 0; i < len; i++)
	{
		if (s[i] == '.')
		{
			p = 1;
			break;
		}
	}
	if (p)
	{
		for (int i = len - 1; i >= 0; i--)
		{
			if (s[i] == '0')
				s[i] = '\0';
			else
				break;
			len--;
		}
		if (s[len - 1] == '.')
			s[len - 1] = '\0';
	}
}
int main()
{
	while (~scanf("%s%s", a, b))
	{
		re(a);
		// printf("%s\n",a);
		re(b);
		// printf("%s\n",b);
		if (strcmp(a, b))
			printf("NO\n");
		else
			printf("YES\n");
	}
	return 0;
}

JAVA:

在这里插入图片描述

import java.math.*;
import java.util.Scanner;
public class Main {

    public static void main(String[] args) {
        Scanner sc= new Scanner(System.in);
        while(sc.hasNext()) {
            BigDecimal a=sc.nextBigDecimal();
            BigDecimal b=sc.nextBigDecimal();
            if(a.compareTo(b)==0)
            {
                System.out.println("YES");
            }
            else {
                System.out.println("NO");
            }
        }
    }

}

命题组代码(来自:蓝桥不拿省一不改名)

语言:C++

在这里插入图片描述

#include<iostream>
#include<cstring>
#include<algorithm>
#define maxn 1000005
using namespace std;
char a[maxn], b[maxn];
void p(char a[])
{
	int ok = 0, l = 0, len = strlen(a);
	for(int i = 0; i < len; i++)
	{
		if(a[i] == '.')
		{
			ok = 1;
			break;
		}
	}
	if(ok)
	{
		for(int i = len - 1; i >= 0; i--)
		{
			if(a[i] == '0')
			{
				a[i] = '\0';
				len--;
			}
			else
			{
				break;
			}
		}
		if(a[len - 1] == '.')
			a[len - 1] = '\0';
	}
}
int main(void)
{
	while(cin >> a >> b)
	{
		int ok = 0, ok1 = 1;
		p(a);
		p(b);
		if(strcmp(a, b))
		{
			cout << "NO" << endl;
		}
		else
		{
			cout << "YES" << endl;
		}
	}
	return 0;
}

**

B - 停车场收费 openJ_Bailian - 2933

**
思路:
很基本的课后作业的样子。是否是多组输入其实是无关AC的,因为OJ默认会多次输入。
坑1、需要注意定义的类型防止强制类型转换,保证是正确的四舍五入;
坑2、cpp应该调用iomanip函数库输出小数点后两位。

代码:
群友贡献(判断标准:1、运行时间最短 2、如果运行时间相等,选择空间小的 3、如果空间也等,则看代码的长度):

C++:
在这里插入图片描述

#include<stdio.h>
int main(){
	double a;
	while(~scanf("%lf",&a)){
		if(a-3<=0)	printf("5.00\n");
		else{
			double b=5+(a-3)*2;
			if(a>=20.5)	printf("40.00\n");
			else
			printf("%.2f\n",b);
		}
		
	}
	return 0;
}

JAVA

在这里插入图片描述

import java.text.DecimalFormat;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        DecimalFormat df = new DecimalFormat("0.00");

        while (input.hasNextDouble()) {
            double n = input.nextDouble();
            double res = 0;
            if(n <= 3.0){
                res = 5;
            }
            else{
                res = 5 + (n - 3)*2;
            }

            if(res <= 40.0){
                System.out.println(df.format(res));
            }
            else{
                System.out.println("40.00");
            }
        }
    }
}

命题组代码(来自:蓝桥不拿省一不改名)
语言:C++
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int main()
{
	double t = 0, price = 0;
	while(cin >> t && t != EOF)
	{
		if(t >= 20.5)
		{
			price = 40;
		}
		else if(t <= 3)
		{
			price = 5;
		}
		else
		{
			price = 5 + (t - 3) * 2;
		}
		cout << fixed << setprecision(2) << price << endl;
	}
	return 0;
}

C - 大小写字母互换 OpenJ_Bailian - 2689

思路:

代码:

群友贡献(判断标准:1、运行时间最短 2、如果运行时间相等,选择空间小的 3、如果空间也等,则看代码的长度):
在这里插入图片描述
C++:

#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
	string s;
	getline(cin,s);
	for(int i=0;i<s.size();i++)
	{
		if(s[i]<='z'&&s[i]>='a')
			s[i]-=32;
		else if(s[i]<='Z'&&s[i]>='A')
			s[i]+=32;
		cout<<s[i];
	}
	cout<<endl;
	return 0;
}

*鉴于Java提交选手过少,且这份题解绝大部分都是我冒着生命危险在课上面用笔记本电脑写的……故从本题开始恕我不再放JAVA最优解…… *
命题组代码(来自:蓝桥不拿省一不改名)
语言:C++
在这里插入图片描述

#include<bits/stdc++.h>

using namespace std;

int main(void)
{
	string s1;
	getline(cin, s1);
	istringstream is(s1);
	string str;
	while(is >> str)
	{
		for(int i = 0; i < str.length(); i++)
		{
			if(str[i] <= 'z' && str[i] >= 'a')
			{
				cout << (char)toupper(str[i]);
			}
			else
			{
				cout << (char)tolower(str[i]);
			}
		}
		cout << " ";
	}
}

来自群友 百花缭乱(2978943928) 的题解
思路:
C题思路就是先读入整个字符串,然后遍历,如果是大写改为小写,如果是小写改为大写,其他不动,最后输出修改后的字符串即可。
代码:

#include <cstdio>
#include <cstring>
#include <cctype>
using namespace std;
char s[100];
int main()
{
    gets(s);
    int len = strlen(s);
    for(int i = 0;i<len;i++)
    {
        if(isupper(s[i]))
        {
            s[i] = s[i]-'A'+'a';
        }
        else if(islower(s[i]))
        {
            s[i] = s[i]-'a'+'A';
        }
    }
    printf("%s\n",s);
    return 0;
}

D - 还是A+B HDU - 1229

**
在这里插入图片描述
思路:

代码:

群友贡献(判断标准:1、运行时间最短 2、如果运行时间相等,选择空间小的 3、如果空间也等,则看代码的长度):

C++:

#include<cstdio>
#include<cmath>
using namespace std;
int main(){
int a,b,k,f;
while(scanf("%d%d%d",&a,&b,&k)!=EOF){
	if(a==0&&b==0){
		break;
	}
	int c=a+b;
	f=1;
	for(int i=0;i<k;i++){
		f*=10;
	}
	if(a%f==b%f){
		printf("-1\n");
	}else{
		printf("%d\n",c);
	}
}	
return 0;
}

命题组代码(来自:蓝桥不拿省一不改名)
语言:C++
在这里插入图片描述

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iomanip>
using namespace std;
int main(void)
{
	int a, b;
	int k, k1, k2;
	int A = 0, B = 0, c[10];
	while(cin >> a >> b >> k)
	{
		k1 = k2 = k;
		int ok = 0;
		if(a == 0 && b == 0) 	break;
		if(a < 10 && b < 10)
		{
			if(a != b)
			{
				ok = 0;
			}
		}
		int sum = a + b, a1 = 0, a2 = 0;
		for(int i = k; i >= 0; i--)
		{
			a1 = a / pow(10, i - 1), a2 = b / pow(10, i - 1);
			a1 %= 10, a2 %= 10;
//			cout << a1 << " " << a2 << endl;
			if(a1 != a2)
			{
				ok = 1;
				break;
			}
		}
		if(ok)
		{
			cout << sum << endl;
		}
		if(!ok)
		{
			cout << -1 << endl;
		}
	}
}

群友贡献 来自 虾酱の复读机 (549020288)

思路:

水题
多组输入 然后0 0 break 要考虑相等的情况 用 a和b分别mod10的k次
如果相等 则输出-1 不相等就输出和

/*cpp*/
#include<cstdio>
#include<cmath>
using namespace std;
int main(){
int a,b,k,f;
while(scanf("%d%d%d",&a,&b,&k)!=EOF){
if(a==0&&b==0){
break;
}
int c=a+b;
f=1;
for(int i=0;i<k;i++){
f*=10;
}
if(a%f==b%f){
printf("-1\n");
}else{
printf("%d\n",c);
}
} 
return 0;
}

E - 竞赛评分 openJ_Bailian - 2704

**

在这里插入图片描述
思路:
代码:
群友贡献(判断标准:1、运行时间最短 2、如果运行时间相等,选择空间小的 3、如果空间也等,则看代码的长度):
C++:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
#include<algorithm>
struct tu{
	int j;
	int t=0;
	int m;
};
int cmp(tu a,tu b)
{
	return a.t>b.t;
}
tu stu[3];
int main()
{
	string x,y,z;
	int a,b,c;
	int t;
	stu[0].j=1;
	stu[1].j=2;
	stu[2].j=3;
	cin>>t;

		for(int i=0;i<t;i++)
		{
			cin>>x>>y>>z;
			if(x=="right")
			{
				stu[0].t+=10;
			}else if(x=="wrong")
			{
				stu[0].t-=10;
			}
			if(y=="right")
			{
				stu[1].t+=10;
			}else if(y=="wrong")
			{
				stu[1].t-=10;
			}
			if(z=="right")
			{
				stu[2].t+=10;
			}else if(z=="wrong")
			{
				stu[2].t-=10;
			}
		}
		sort(stu,stu+3,cmp);
		stu[0].m=1;
		for(int i=1;i<3;i++)
		{
			if(stu[i-1].t>stu[i].t)
			{
				stu[i].m=stu[i-1].m+1;
			}else{
				stu[i].m=stu[i-1].m;
			}
		}
		for(int i=0;i<3;i++)
		{
			printf("(%d,%d)",stu[i].j,stu[i].t);
			if(i<2)
			{
				if(stu[i].m!=stu[i+1].m)
				{
					printf("\n");
				}
			}
	}
	return 0;
} 

命题组代码(来自:蓝桥不拿省一不改名)
语言:C++
在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;
struct team{
	int no;
	int score = 0;
}t[3];

bool cmp(const team &a,const team &b)
{
	if(a.score == b.score)
	{
		return a.no < b.no;
	}
	else
	{
		return a.score >= b.score;
	}
}

int main(void)
{
#ifdef LOCAL
	freopen("outputL.txt","w",stdout);
#endif
	int n;
	t[0].no = 1, t[1].no = 2, t[2].no = 3;
	string a;
	cin >> n;
	while(n--)
	{
		for(int i = 0; i < 3; i++)
		{
			cin >> a;
			if(a == "right")
			{
				t[i].score += 10;
			}
			else if(a == "wrong")
			{
				t[i].score -= 10;
			}
		}
	}
	sort(t, t + 3, cmp);
	for(int i = 0; i < 3; i++)
	{
		if(i>0){
		if(t[i].score != t[i-1].score)
		{
			cout << endl;
		}
	}
		cout << "(" << t[i].no << "," << t[i].score << ")" ;
	}
	return 0;
}

群友贡献 来自 def(self)(934556594)

思路:
结构体来存储数据,每输入一行对应队伍加上或减上10分,不回答就不用处理,然后按总分降序排序,然后从头开始排名,前一个分数跟后一个分数相同,名次就相同,不相同就加1。最后再按照格式输出就好
代码:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
#include<algorithm>
struct tu{
	int j;
	int t=0;
	int m;
};
int cmp(tu a,tu b)
{
	return a.t>b.t;
}
tu stu[3];
int main()
{
	string x,y,z;
	int a,b,c;
	int t;
	stu[0].j=1;
	stu[1].j=2;
	stu[2].j=3;
	cin>>t;

		for(int i=0;i<t;i++)
		{
			cin>>x>>y>>z;
			if(x=="right")
			{
				stu[0].t+=10;
			}else if(x=="wrong")
			{
				stu[0].t-=10;
			}
			if(y=="right")
			{
				stu[1].t+=10;
			}else if(y=="wrong")
			{
				stu[1].t-=10;
			}
			if(z=="right")
			{
				stu[2].t+=10;
			}else if(z=="wrong")
			{
				stu[2].t-=10;
			}
		}
		sort(stu,stu+3,cmp);
		stu[0].m=1;
		for(int i=1;i<3;i++)
		{
			if(stu[i-1].t>stu[i].t)
			{
				stu[i].m=stu[i-1].m+1;
			}else{
				stu[i].m=stu[i-1].m;
			}
		}
		for(int i=0;i<3;i++)
		{
			printf("(%d,%d)",stu[i].j,stu[i].t);
			if(i<2)
			{
				if(stu[i].m!=stu[i+1].m)
				{
					printf("\n");
				}
			}
	}
	return 0;
} 

**

F - 数字反转 OpenJ_Bailian - 4029

在这里插入图片描述
**
思路:
代码:
群友贡献(判断标准:1、运行时间最短 2、如果运行时间相等,选择空间小的 3、如果空间也等,则看代码的长度):
C++:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string s,t;
    long long n;
    bool f;
   string A;
    while(cin>>A){
        
        f=0;
        
        //cout<<s<<' '<<t<<'\n';
        int n=A.length();
        int i=0;
        bool f=0;
        if(A[i]=='-'){
            i++;
            f=1;
            //cout<<'-';
        }

        bool g=1;
        for(int j=n-1;j>=i;j--){
            if(A[j]=='0'&&g);
            else if(A[j]!='0'&&g){
                if(f)cout<<'-';
                g=0;
                cout<<A[j];
            }
            else cout<<A[j];
        }
        if(g)cout<<0;
        cout<<'\n';

    }
}

命题组代码(来自:蓝桥不拿省一不改名)
语言:C++
在这里插入图片描述

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cctype>
#include<iomanip>
#include<cstdio>
#include<stack>
#include<map>
#include<set>
#include<vector>
using namespace std;
stack<char> mystack;
char s1[1000000000];
int main(void)
{
	long long a1;
	int ok = 0;
	cin >> a1;
	if(a1 < 0)
	{
		ok = 1; 
		a1 = -a1;
	}
	if(a1 == 0)
	{
		cout << 0;
		return 0;
	}
	sprintf(s1, "%lld", a1);
	int s = strlen(s1);
	for(int i = 0; i < s; i++)
	{
		mystack.push(s1[i]);
	}
	while(mystack.top() == '0')
	{
		mystack.pop();
		s--;
	}
	if(ok)
		cout << "-";
	for(int i = 0; i < s; i++)
	{
		cout << mystack.top();
		mystack.pop();
	}
	return 0;
}

G - 词组缩写 HDU - 2564

在这里插入图片描述
**

思路:

代码:

群友贡献(判断标准:1、运行时间最短 2、如果运行时间相等,选择空间小的 3、如果空间也等,则看代码的长度):

C++:

#include <iostream>
#include <ctype.h>
#include <cstdio>
#include <cstdlib>
#include <cstring>

using namespace std;

int main()
{
	int t, len;
	char ch[1024], c;
	scanf("%d", &t);
	getchar();
	while(t--)
	{
		gets(ch);
		len = strlen(ch);
		for(int i = 0; i < len; i++)
		{
			if(!i)
			{
				if(isalpha(ch[i]))
				{
					printf("%c", toupper(ch[i]));
				}
			}
			else
			{
				if(isalpha(ch[i]) && ch[i - 1] == ' ')
				{
					printf("%c", toupper(ch[i]));
				}
			}
		}
		printf("\n");
	}
	return 0;
}

命题组代码:来自:(蓝桥不拿省一不改名)
语言:C++
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
	string s1;
	int t;	
	cin >> t;
	getchar();
	while(t--)
	{
		getline(cin, s1);
		istringstream is(s1);
		string str;
		while(is >> str)
		{
			cout << (char)toupper(str[0]);
		}
		cout << '\n';
	}
	return 0;
}

**群友贡献 来自 萌新复读机 (767300336) **
思路:
除了第一个一上来就变成大写字母输出以外,其他的字母只要前面有空格的就变成大写字母输出
代码:

#include <iostream>
#include <ctype.h>
#include <cstdio>
#include <cstdlib>
#include <cstring>

using namespace std;

int main()
{
	int t, len;
	char ch[1024], c;
	scanf("%d", &t);
	getchar();
	while(t--)
	{
		gets(ch);
		len = strlen(ch);
		for(int i = 0; i < len; i++)
		{
			if(!i)
			{
				if(isalpha(ch[i]))
				{
					printf("%c", toupper(ch[i]));
				}
			}
			else
			{
				if(isalpha(ch[i]) && ch[i - 1] == ' ')
				{
					printf("%c", toupper(ch[i]));
				}
			}
		}
		printf("\n");
	}
	return 0;
}

H - 八皇后问题 OpenJ_Bailian - 2698

思路:
代码:
群友贡献(判断标准:1、运行时间最短 2、如果运行时间相等,选择空间小的 3、如果空间也等,则看代码的长度):
C++:

#include<stdio.h>
#include<stdlib.h>
int hang[11], n=8;
int a[10][10]={0};
int t=1;
void print(){
	printf("No. %d\n",t++);
	for(int i=1;i<=8;i++){
		for(int j=1;j<=8;j++){
			printf("%d ", a[j][i]);
		}
		printf("\n");
	}
}
bool judge(int n){
	for(int i=1;i<n;i++)
		if(hang[n]==hang[i] || abs(hang[i]-hang[n])==n-i)
			return 0;
	return 1;
}
void dfs(int n){
	if (n>=9){
		print();
	}
	for(int i=1;i<=8;i++){
		hang[n]=i;
		if(a[n][i]!=1&&judge(n)){
			a[n][i]=1;
			dfs(n+1);
			a[n][i]=0;
		}		
	}
}
int main(){ 
	dfs(1);
	return 0;
} 

命题组代码(来自:蓝桥不拿省一不改名)
语言:C++
在这里插入图片描述

#include<iostream>
#include<cmath>
using namespace std;
const int N = 9;
int book[N][N],tot;
bool check(int x,int y)
{
    for(int i=1;i<=x;i++){
    if(book[i][y]) return false;
    for(int j=1;j<=8;j++){
        if(book[i][j]){
            if(fabs(i-x)-fabs(j-y)==0) return false;
            else break;
        }
    }
}
return true;
}
void dfs(int step)
{
    if(step==N){
        tot++;
        cout<<"No. "<<tot<<endl;
        for(int i=1;i<=8;i++){
            for(int j=1;j<8;j++)
                cout<<book[j][i]<<' ';
            cout<<book[8][i]<<endl;
        }
        return ;
    }
    for(int i=1;i<=8;i++){
        if(check(step,i)){
            book[step][i]=1;
            dfs(step+1);
            book[step][i]=0;
        }
    }
    return ;
}
int main()
{
    dfs(1);
    return 0;
}

在这里插入图片描述
**群友贡献 来自 唯一指定废物(1127856424) **
思路:
右上到左下的x轴y轴相加相等,左上到右下的x轴减y轴的绝对值相当

附上草图一张 :

在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
int row[10],n=8;
int a[10][10];
int t=1;
bool judge(int n){
	for(int i=0;i<n;i++)
		if(row[n]==row[i] || abs(row[i]-row[n])==n-i)	//在开始循环时就不会有同行的情况;
														//	判一下列和对角(绝对值)/的x轴y轴相加相等,\的x轴减y轴的绝对值相当 这个自己思考一下就好,这样写起来更快(虽然我也是嫖了才知道的) 
			return 0;
	return 1;
}
void dfs(int n){
	if (n>=8){	//退出的条件八个了 
		printf("No. %d\n",t++);
		for(int i=0;i<8;i++){
			for(int j=0;j<8;j++){
				printf("%d ", a[j][i]); //这个反一下输出; ps(不然和样例是反的。。。) 
			}
			printf("\n");
		}
	}
	for(int i=0;i<8;i++){
		row[n]=i;
		if(a[n][i]!=1&&judge(n)){
			a[n][i]=1;
			dfs(n+1);
			a[n][i]=0;
		}		
	}
}
//表达的不太好,要是还是不会艾特一下我; 
int main(){ 
	dfs(0);
	return 0;
} 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值