T1

100pits100pits

sort排序 ans累加 非常简单 不知道某蒟蒻居然不会(太菜了)(嘻嘻)

不开long long 见祖宗

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int t[N],v[N];
bool cmp(int a,int b){
	return a>b;
}
int main(){
	
	freopen("coin.in","r",stdin);
	freopen("coin.out","w",stdout);
	
	int n,k;
	cin>>n>>k;
	for(int i=1;i<=n;i++) cin>>t[i];
	for(int i=1;i<=n;i++) cin>>v[i];
	
	sort(v+1,v+n+1,cmp);
	long long ans=0;
	for(int i=1;i<=k;i++) ans+=v[i];
	
	cout<<ans;
	return 0;
}

T2

60pits60pits

错误原因:没有思考到特殊情况;

思路:将a与b的差减小

a : 3 2 1
      ^ ^
      | |
b : 2 3 9

a : 3 3 9
b : 2 2 1

#include<bits/stdc++.h>
using namespace std;

bool cmp(string a,string b){
	for(int i=0;i<=a.size()-1;i++){
		if(a[i]>b[i])
		return true;
		if(a[i]<b[i])
		return  false;
	}
	
}

string a1,b1;
void f(){
	for(int i=1;i<=a1.size()-1;i++){
		if(a1[i]>b1[i]&&a1[i-1]!=b1[i-1]){
			char s=a1[i];
			a1[i]=b1[i];
			b1[i]=s;
			
		}
		
	}
	
}
int main(){
	
	freopen("mul.in","r",stdin);
	freopen("mul.out","w",stdout);
	string a,b;
	cin>>a>>b;
	
	if(cmp(a,b)){
		a1=a;
		b1=b;
	}
	else{
		a1=b;
		b1=a;
	}
	
	f();
	long long num1=0,num2=0,ans;
	for(int i=0;i<=a1.size()-1;i++){
		num1=num1*10+a1[i]-'0';
		num2=num2*10+b1[i]-'0';
	}
	ans=num1*num2;
	cout<<ans;
	return 0;
}

T3

100pits100pits

高精度除法 a/(b-1)

#include<bits/stdc++.h>
using namespace std;
string a;
long long b;
vector<int> A,ans1,ans2;
void f(){
	long long res=0;
	for(int i=0;i<=A.size()-1;i++){
		res=res*10+A[i];
		ans1.push_back(res/b);
		res%=b;
	}
	for(int i=ans1.size()-1;i>=0;i--) ans2.push_back(ans1[i]);
	while(ans2[ans2.size()-1]==0 && ans2.size()>1 )  ans2.pop_back();
}
int main(){
	freopen("drink.in","r",stdin);
	freopen("drink.out","w",stdout);
	cin>>a>>b;
	for(int i=0;i<=a.size()-1;i++) A.push_back(a[i]-'0');
	b-=1;
	f();
	for(int i=ans2.size()-1;i>=0;i--) cout<<ans2[i];
	return 0;
}

T4

错误原因: 真的不会

老师代码

#include<bits/stdc++.h>
using namespace std ;
int main() 
{
	freopen("op.in", "r", stdin);
	freopen("op.out", "w", stdout);
	std::ios::sync_with_stdio(false) , cin.tie(0) ;
	
	int n , k ;
	cin >> n >> k ;
	vector<int> p(n + 1 , 0) ;    
	vector<int> t(n + 1 , 0) ;    
	vector<int> a(n + 1 , 0) ;    
	vector<int> b(n + 1 , 0) ;    
	for(int i = 1 ; i <= n ; i ++)  cin >> p[i] ;
	for(int i = 1 ; i <= n ; i ++)  cin >> t[i] ;
	for(int i = 1 ; i <= n ; i ++)  cin >> a[i] ;
	for(int i = 1 ; i <= n ; i ++)  cin >> b[i] ;
	vector<int> id(n + 1 , 0) ;
	for(int i = 1 ; i <= n ; i ++)  id[i] = i ;
	sort(id.begin() + 1 , id.end() , [&](int x , int y)
	{
		return p[x] < p[y] ;  // 匿名函数,等同于cmp函数,这里按p严重度小的排序
	}) ;
	set<pair<int , int>> s ;
	s.insert({1 , k}) ;  // 初始可以手术区间
	long long res = 0 ;
	for(int i = 1 ; i <= n ; i ++)
	{
		int c = id[i] ;  // 当前优先级最高的病患编号
		if(s.empty())  break ;  // s为空说明结束
		auto it = s.lower_bound({t[c] , 0}) ; // 返回>=t[c]的最小值
		auto it2 = it ;
		if(it2 != s.begin())  it2 -- ;
		if(it2 -> first <= t[c] && t[c] <= it2 -> second)  it = it2 ; // 找到可以安排手术的最早时间
		if(it != s.end()) // 没有超出s边界
		{
			t[c] = max(t[c] , it -> first) ; // 安排手术的时间是 max(ti, 最早可做的时间)
			if(t[c] <= it -> second)  // it->second 是区间右端点,满足条件说明可以插入到此区间
			{
				if(it -> first < t[c]) // it-first 是区间左端点
				{
					// 此处的操作是:1.删除[l,r] 2.插入[l,t_i-1] [t_i, r]
					// 以[1, 10] 插入[4,5] 为例,[1,10] --> [1, 3] [6, 10]
					int l = it -> first ; 
					int r = it -> second ;
					s.erase({l , r}) ;  
					s.insert({l , t[c] - 1}) ;
					s.insert({t[c] , r}) ;
					it = s.lower_bound({t[c] , 0}) ; // 更新可以安排手术的最早区间
				}
				vector<pair<int , int>> v ; // 用来存中间不可用需要删除的区间
				while(it != s.end()) // 边界判断
				{
					int l = it -> first ;
					int r = it -> second ;
					if(r - l + 1 >= b[c]) // 区间长度大于手术时间,可以安排手术
					{
						res += a[c] ; // 收钱
						s.erase(it) ; // 删除掉这段区间
						if(r - l + 1 > b[c])  s.insert({l + b[c] , r}) ; // 插入更新后的区间
						break ;
					}
					else
					{
						// 中间不可以插入的区间,也不能给后续的患者用了,否则会医闹
						v.push_back({l , r}) ; 
						it ++ ;
					}
				}
				for(auto now : v)  s.erase(now) ; // 删除中间的无用区间
			}
		}
	}
	cout << res << '\n' ;
	
	return 0 ;
}