UCF Local Programming Contest 2017的正式赛

1.Problem A : Electric Bill

题目大意:进行电量分级制收费,1000kwh及以下一档收费,1000kwh以上按另一档收费,给出每个人的电量总额,问每人应支付多少钱。

思路:基础 (最简单)if else题,对于每个电量判断是否大于1000,再分别计算≤1000的价格和>1000的价格,最后相加并输出。

AC代码:

#include<iostream>
using namespace std;
#define N 50007
int main()
{
int a,b,n,c[N];
cin>>a>>b>>n;
for(int i=0;i<n;i++){
int sum=0;
cin>>c[i];
if(c[i]>=1000){
sum=a*1000+b*(c[i]-1000);
cout<<c[i]<<" ";
cout<<sum<<endl;
}
else {cout<<c[i]<<" ";
cout<<a*c[i]<<endl;}
}
}

2.

Problem B : Simplified Keyboard

题目大意:给出一个字母分布图,如果两个字符串对应位置的字母全都相等,字符串属性为1,否则若两个字符串对应位置字母均相邻或相等,字符串属性为2,否则字符串属性为3. 现给出两个字符串,问这两个字符串的属性。

题解的思路:可以先预处理每个字母的相邻关系,然后若a字符串与b字符串长度不等则属性必为3。长度相等时,遍历ab字符串并比较对应位置,并记录相等的数量及相邻的数量,最后判断输出。(代码很复杂)

我本人的思路:转化成数学问题,是某个字母周围的字母这个问题不好处理,用ASII码值,转化为数学问题

代码如下:

/*本来想用并查集,后来发现……*/

#include<iostream>
#include<string>
#include<cmath>
using namespace std;
/*#define N 100001
int father[N];
int find(int x){
while(father[x]!=x)//自己是自己,根节点
x=father[x];//不是继续找,找老大
return x;
}
void merge(int a,int b){
int a1=find(a);//找到根节点,找到老大
int b1=find(b);
if(a1!=b1)//老大不同,认主
father[a1]=b1;
}*/
int main()
{
int w;
cin>>w;
while(w--){
/* for(int i='a';i<='z';i++){
father[i]=i;//每个人是自己的掌门
}*/
string s1,s2;
int c,d;
d=c=0;
cin>>s1>>s2;
int a=s1.size();
int b=s2.size();
if(a==b){
for(int i=0;i<a;i++){
if(abs(s1[i]-s2[i])!=0){
c=1;
if(abs(s1[i]-s2[i])==1||abs(s1[i]-s2[i])==9||abs(s1[i]-s2[i])==8||abs(s1[i]-s2[i])==10)
continue;
else {d=1;cout<<"3"<<endl;break;}
}
else continue;
}
if(c==0)cout<<"1"<<endl;
else if(d==0){cout<<"2"<<endl;};
}
else cout<<"3"<<endl;
}
}

猜你喜欢

转载自www.cnblogs.com/1324a/p/12661870.html