Codeforces Round 811 (Div. 3) A-C、E

发布时间:2024年01月17日

A.Everyone Loves to Sleep

? ? ? ? 模拟、贪心。首先将上床时间转换为总的分钟数,设为sum,接着读入每一个闹钟,与sum相减,记录差值的最小值。若为负则证明是隔夜闹钟,此时加上24*60(一天总分钟数)调至同一天,再进行记录即可。

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N=2e5+5;
int a[N];

void solve(){
    int n,bh,bm;cin>>n>>bh>>bm;
    int sum=bh*60+bm;
    int ans=999999;
    for(int i=1;i<=n;i++){
        int h,m;cin>>h>>m;
        int tem=h*60+m-sum;
        if(tem<0) tem+=24*60;//解决隔天闹钟
        ans=min(tem,ans);
    }
    cout<<ans/60<<" "<<ans%60<<endl;
}

//多组输入
signed main(){
	ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);//解绑
	int t=1;
	cin>>t;
	while(t--) solve();
	return 0;
}

B.Remove Prefix?

? ? ? ? 模拟、思维。由题意得,只需要维护序列内没有相同数字。不妨逆向思维,从序列最后开始,当序列出现一对相同数字时,则直接输出该数字的位置,即从左到右删到该处能保证剩余序列没有相同数字。

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N=2e5+5;
int a[N],num[N];

void solve(){
    memset(num,0,sizeof num);
	int n;cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=n;i>=1;i--){
        if(num[a[i]]){
            cout<<i<<endl;
            return;
        }
        num[a[i]]++;
    }
     cout<<"0"<<endl;
}

//多组输入
signed main(){
	ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);//解绑
	int t=1;
	cin>>t;
	while(t--) solve();
	return 0;
}

C.Minimum Varied Number

? ? ? ? 暴力枚举、模拟、排序。只需要一个个试出来,最后排一次序即可。

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N=2e5+5;
int a[N];

void solve(){
    int n;cin>>n;
    string ans;
    int sum=n;
    for(int i=9;i>=1;i--){
        if(sum>=i){
            ans+=('0'+i);
            sum-=i;
        }
    }
    sort(ans.begin(),ans.end());
    cout<<ans<<endl;
}

//多组输入
signed main(){
	ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);//解绑
	int t=1;
	cin>>t;
	while(t--) solve();
	return 0;
}

E.Add Modulo 10

? ? ? ? 数学、思维。由题目给的样例可以得到规律,经过多次操作后,尾数总会是2,4,8,6的循环或是5,0的循环。若为奇数时,1->2,3->6,7->4,9->8,5->0可以保持规律。因此该题只需要讨论5的倍数与其他。

????????当序列内出现5的倍数时,仅当序列内其他所有数字全部为5的倍数时,才能满足题意。

? ? ? ? 讨论其他数字时,我们可以进行模拟题目操作,通过判断操作后数字是否相等来判断是否符合题意。而要实现有两个关键点:1.将所有的数据操作至以2为尾数(当然4,6,8也行,只要统一就行)2.上述找规律可发现,当经过一轮2,4,8,6的循环时,会比原始数字加20,故我们可以对20取模,保证数字相等。

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N=2e5+5;
int a[N];

void solve(){
	int n;cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	int cnt=0;
	for(int i=1;i<=n;i++) if(a[i]%5==0) cnt++;
	if(cnt>0&&cnt<n){
		cout<<"No"<<endl;
		return;
	}

	for(int i=1;i<=n;i++){
		//将尾数调整统一调整为2或0
		while(a[i]%10!=2&&a[i]%10!=0){
			a[i]+=a[i]%10;
		}
	}

	if(!cnt) for(int i=1;i<=n;i++) a[i]%=20;

	for(int i=2;i<=n;i++){
		if(a[i]!=a[i-1]){
			cout<<"No"<<endl;
			return;
		}
	}

	cout<<"Yes"<<endl;
}

//多组输入
signed main(){
	ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);//解绑
	int t=1;
	cin>>t;
	while(t--) solve();
	return 0;
}

? ? ? ? 本蒟蒻暂时不会D题,待更新ToT。

文章来源:https://blog.csdn.net/TaopiTTT/article/details/135635967
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。