天梯+个人

7-3 N个数求和 (20分)

思路:一个个来,我当时忘了GCD是咋写的了,所以没写出来

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll gcd(ll a,ll b){
if(b)while((a%=b)&&(b%=a));
return a+b;
//if(a%b==0)return b;
//else return(gcd(b,a%b));
}
int main(){
int t;
cin>>t;
ll a,b,c,d;
scanf("%lld/%lld",&a,&b);
scanf("%lld/%lld",&c,&d);
ll f=a*d+b*c;
ll m=b*d;
//cout<<f<<" "<<m<<endl;
ll q=gcd(m,f);
f/=q;
m/=q;
t=t-2;
//cout<<f<<" "<<m<<endl;
while(t--){
scanf("%lld/%lld",&a,&b);
f=f*b+a*m;
m=m*b;
q=gcd(f,m);
// cout<<"q="<<q<<endl;
f/=q;
m/=q;
//cout<<f<<" "<<m<<endl;
}
if(f&&f/m==0)
printf("%lld/%lld\n",f%m,m);
else if(f%m==0)
printf("%lld\n",f/m);
else

printf("%lld %lld/%lld\n",f/m,f%m,m);

}
/* if(f>m){
ll w=f/m;
f=f%m;
if(f%m!=0)
cout<<w<<" "<<f<<"/"<<m<<endl;
else cout<<w<<endl;
}
else{
cout<<f<<"/"<<m<<endl;
}*/

7-9 名人堂与代金券 (25分)

思路:写结构体排序,当时输出不会搞,没做出来

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+7;
#define ll long long
struct Q{
string s;
int score;
};
Q a[N];
bool cmp(Q b,Q c){
if(b.score!=c.score)return b.score>c.score;
else return b.s<c.s;
}
int main(){
int n,g,k;
cin>>n>>g>>k;
int sum=0;
for(int i=0;i<n;i++)
{
cin>>a[i].s>>a[i].score;
if(a[i].score>=g)sum+=50;
else if(a[i].score>=60)sum+=20;
}
sort(a,a+n,cmp);
cout<<sum<<endl;
int w=0;
for(int i=0;i<n;i++){

if(i==0||a[i].score!=a[i-1].score){w=i+1;}
if(w>k)break;
cout<<w<<" "<<a[i].s<<" "<<a[i].score<<endl;
}
}

 7-11 部落 (25分)

没写到

看了别人的
#include<stdio.h>
#include<iostream>
#include<cstring>
#define maxn 100000
int f[maxn];
using namespace std;
void init() //初始化函数因为没有告知人数所以就到maxn(作用:根都为自己)
{
for(int i=1;i<=maxn;i++){
f[i]=i;
}
}
int getf(int a) //找爹函数(找根)
{
if(f[a]==a) //找到根(爹是自己~ ~),退出
return a;
else{
f[a]=getf(f[a]);//递归调用,找该树的根(祖先)
return f[a];
}
}
void merge(int v,int u) //找两个树的关系,如果祖先不一样(即没有关系,就合并,这里采用偏左原则)
{
int t1,t2;
t1=getf(v);
t2=getf(u);
if(t1!=t2){
f[t2]=t1; //让t1为t2的爹
}
}
int main()
{
int n1,party[maxn],map[maxn];
int m,n=0,su=0,n2;
int i,a,b;
int sum=0;
cin>>m;
init();
memset(map,-1,sizeof(maxn)); //把map的值都设为-1,函数头文件#include<csting>,格式:memset(地址,需要设置成的值,sizeof);
while(m--)
{
cin>>n1;
n=n+n1;
for(i=1;i<=n1;i++){
cin>>party[i];
map[party[i]]=1; //输入时会用重复的,用标记数组map,进行标记,把输入树对应的值改为1
if(i-1)
merge(party[i-1],party[i]);
}
}
for(i=0;i<=n;i++){ //n没实际含义,只是圈定了一个范围,毕竟maxn太大
if(map[i]==1){
sum++;
}
}
for(i=1;i<=sum;i++){
if(f[i]==i){
su++;
}
}
cin>>n2;
cout<<sum<<" "<<su<<endl;
while(n2--){
cin>>a>>b;
if(getf(a)==getf(b))
cout<<"Y"<<endl;
else
cout<<"N"<<endl;
}
return 0;
}

7-12 月饼 (25分)

当时确实没想到啥样是最合适的

#include<bits/stdc++.h>
using namespace std;
#define N 100000
struct A{
double weight;
double price;
};
int main() {
A a[N];

int n,w;
cin>>n>>w;
for(int i=0;i<n;i++){
cin>>a[i].weight;
}
for(int i=0;i<n;i++){
cin>>a[i].price;
}
for(int i=1;i<n;i++){
for(int j=0;j<n-i;j++){
if(a[j].price/a[j].weight<a[j+1].price/a[j+1].weight){
A t;
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}

double sum=0;
for(int i=0;i<n;i++){
//cout<<a[i].price<<" "<<a[i].weight<<endl;
if(w){
if(w>=a[i].weight){sum+=a[i].price;w-=a[i].weight;}
else{
sum+=w*a[i].price/a[i].weight;
w-=w;
}
}
else break;
}
printf("%.2f",sum);
}

A Blend of Springtime

只要三个不同,之前傻了,就像以为a!=b,b!=c,a和c一定不相同,太傻了

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+7;
//#define ll long long
//ll a[N];
int main(){
ios::sync_with_stdio(false);
string s;
cin>>s;
int n=s.size();
int w=0;
for(int i=0;i<n;i++){
if(isalpha(s[i])){
if(isalpha(s[i+1])&&isalpha(s[i+2])&&s[i]!=s[i+1]&&s[i+1]!=s[i+2]&&s[i]!=s[i+2])
{w=1;
break;}
}
}
if(w)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}

B - A Tide of Riverscape

 

给你一个串,其中包含01.种字符,你可以在.的位置填入01,问你能不能不让这个串的循环周期为p,能的话输出填满之后的串,不能的话输出No

扫一遍,看看能不能使xx+p这两个位置的值不同即可。( 其实,,,,我觉着,我的也对,但就是在第18个测试点过不去),以下是看了别人的代码

#include <bits/stdc++.h>
char str[2007];
int main() {
int n, p;
std::cin >> n >> p >> str;
bool flag = false;
for (int l = 0, r; (r = l + p) < n; l++) {
if (str[l] != str[r]) {
if (str[l] == '.') str[l] = ('1' - str[r]) + '0';
else if (str[r] == '.') str[r] = ('1' - str[l]) + '0';
flag = true;
break;
} else if (str[l] == '.') {
str[l] = '1', str[r] = '0';
flag = true;
break;
}
}
if (flag) {
for (int i = 0; i < n; i++) {
if (str[i] == '.') putchar('0');
else putchar(str[i]);
}
putchar('\n');
} else puts("No");
return 0;
}

posted @ 2020-10-18 21:38  CHUNIN  阅读(66)  评论(0)    收藏  举报