**
A - A == B ? HDU - 2054
**
思路:
题干给的信息不是很多,但是我第一时间对可能的坑的反应就是:1、没说明数字的范围,那么最好用字符串防止爆long long;2、可能会有小数点陷阱,即下面样例示意的;3、可能会有多个零,所以必须要多次判断多次清除无效0,推荐用while;4、输出的YES、NO应该注意大小写防止PE。
样例的数据往往存在挖坑误导的嫌疑,虽然是一个简单的A == B,但是你得考虑如下几种测试样例:
- 1.0 == 1.000000000000000001 ?
- 0.0 = 0 ?
- 1000 = 100 ?
- 0001 == 01 ?
- 1.0 = 1 ?
- 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;
}