8.30刷题笔记

奖学金

P1093 [NOIP2007 普及组] 奖学金 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include <bits/stdc++.h>
using namespace std;
#define int long long
struct stud{
	int id,chinese,sum;
}a[310];
bool cmp(stud a,stud b){    //不是a.sum 地址
	if(a.sum>b.sum) return true; 
	else if(a.sum==b.sum
	&&a.chinese>b.chinese)return true;
	else if(a.sum==b.sum
		&&a.chinese==b.chinese
		&&a.id<b.id)return true;    //    < 警告,小号在上(sort里大)
	else 
		return false;
}
signed main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int N,math,eng;
	cin>>N;
	for(int i=0;i<N;i++){
	cin>>a[i].chinese>>math>>eng;
	a[i].sum=a[i].chinese+math+eng;    //没必要math,eng也加入结构体
	a[i].id=i+1;
	}
	sort(a,a+N,cmp);                    //没事,标一下
	for(int i=0;i<5;i++){
	cout<<a[i].id<<" "<<a[i].sum<<'\n';
	}
	return 0;
}

 宇宙总统

P1781 宇宙总统 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

和上面题差不多,用到了高精度(不愧是宇宙总统,有100位数票)

主函数简简单单,重要的是结构体&比较函数

#include <bits/stdc++.h>
using namespace std;
#define int long long
struct node{
	string x;
	int num;
}a[210];
bool cmp(node a,node b){
	if(a.x.length()!=b.x.length())
		return a.x.length()>b.x.length();//还能这么写,类似判断大小?
	return a.x>b.x;
}

signed main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int N;
	cin>>N;
	for(int i=0;i<N;i++){
		cin>>a[i].x;
		a[i].num=i+1;
	}
	sort(a,a+N,cmp);                    //没事,还是标一下
	cout<<a[0].num<<"\n"<<a[0].x;
	return 0;
}

统计方形

tP2241 统计方形(数据加强版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P2241

看题解吧(题解 P2241 【统计方形(数据加强版)】 - 原株龙葵的博客 - 洛谷博客 (luogu.com.cn)

首先,统计一个n*m的矩形里有多少个正方形,长方形。

要明确,正方形和长方形都是矩形,那么n*m的矩形里的

矩形数=正方形数+长方形数

明确这一点后,就可以一次求出二者了

如图,长为2宽为1的小长方形用〇来表示,那么

横向排列的就有 *(n-1)m 个

竖向排列的就有 n(m-1)* 个

证明:

     ∵ 矩形长不等于宽

     ∴ 子矩形构成的矩阵的长宽是由原矩形长宽减去不同数而得
     
     即(n-b)*(m-a) (a≠b)

如图,用 · 表示长宽均为二的正方形

即有(n-1)*(m-1)个小正方形

证明:

	∵正方形长等于宽

    ∴子正方形构成的矩阵的长宽由原矩形长宽减去相同数而得
    
    即(n-b)*(m-a) (a=b)
(n-b)*(m-a) (a=b)

上代码!(最短)

#include<iostream>
using namespace std;
long long n,m,rec,sqr;
int main() {
    cin>>n>>m;
    for(int i=0; i<n; i++)//循环,从n-0到n-(n-1)
        for(int j=0; j<m; j++) {//循环,从m-0到m-(m-1)
            if(i==j) sqr+=(n-i)*(m-j);//如果i==j,说明是正方形
            else rec+=(n-i)*(m-j);//如果不等说明是矩形
        }
    cout<<sqr<<" "<<rec<<endl;//输出
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值