问题 D: 洁净无瑕
时间限制: 1 Sec 内存限制: 128 MB
[提交] [状态]
题目描述
小X是一位富豪,酷爱收藏宝石。
在他的收藏柜中,从左到右依次摆放着各种形态不一的钻石。为了评价一颗钻石的美观程度,小X为每颗钻石赋予了一个洁净度ai。
小X认为,钻石之间不能太冲突。他会从左到右依次看过去,若两颗相邻的钻石,其中一颗的洁净度为奇数,另一个为偶数,他就会下定狠心将这两颗钻石扔掉。如此反复,直到没有冲突的钻石了。
现在他想知道,最后收藏柜中会剩下多少颗钻石。
输入
第一行一个整数n,表示钻石的个数。
第二行共n个正整数,第i个数为钻石的洁净度ai。
输出
一行一个整数,表示最后剩下的钻石的数量。
样例输入 Copy
4
1 3 2 4
样例输出 Copy
0
提示
第二个和第三个钻石产生了冲突,接着第一个和第四个钻石产生了冲突,因此没有钻石剩下。
对于60%的数据,n≤1000。
对于100%的数据,n≤1000000。
|ai|≤232−1,数据有梯度。
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N=100005;
int n;
stack<ll>q;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
ll a;
scanf("%lld",&a);
if(i==1||q.empty()) q.push(a);
else
{
ll tmp=q.top();
if((tmp%2)+(a%2)==1)
q.pop();
else q.push(a);
}
}
cout<<q.size();
return 0;
}
问题 F: 魔法序列
时间限制: 1 Sec 内存限制: 128 MB
[提交] [状态]
题目描述
小E为了完成公主的任务,需排布魔法阵,从中获得法力。
简单起见,魔法阵可以看成一个长度为n的序列。序列从左到右都摆放了一张符卡,符卡有一个强度ai。法术的释放要每个元素相互配合,取得共鸣效果。一个由一些符卡组成的咒语的魔力值为这个咒语中所有符卡的强度的最大公因数乘以符卡的个数。
小E会从魔法阵中选择一段连续符卡区间[l,r](包括l,r端点),作为吟唱的咒语。她想知道,咒语最大的魔力值是多少。
输入
第一行一个整数n,表示符卡个数。
第二行n个正整数,第i个数表示符卡的强度ai。
输出
输出一个整数,表示最大的魔力值。
样例输入 Copy
5
30 60 20 20 20
样例输出 Copy
80
提示
样例解释
选择区间[2,5],其中gcd(60,20,20,20)=20,故魔力值为(5-2+1)*20=80。
此代码,参照大佬的,还要再理解一下啊。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+100;
ll n,a[maxn],ans;
ll gcd(ll a,ll b){
return b==0?a:gcd(b,a%b);
}
map<ll,ll>mp1,mp;
int main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
for(int i=1;i<=n;i++){//枚举右端点
mp=mp1;//用之前的区间更新这次对于右端点来说gcd的值和位置
mp1.clear();//清空
ans=max(ans,a[i]);//自己一个
if(!mp1.count(a[i])) mp1[a[i]]=i;
for(auto it=mp.begin();it!=mp.end();it++){
ll tmp=gcd(a[i],it->first);
ans=max(ans,tmp*(i-it->second+1));
if(!mp1.count(tmp)) mp1[tmp]=it->second;//用于下次
else mp1[tmp]=min(mp1[tmp],it->second);//最小右端,让区间能长
}
}
printf("%lld",ans);
return 0;
}
问题 E: 夜莺之歌
时间限制: 2 Sec 内存限制: 128 MB Special Judge
[提交] [状态]
题目描述
小W酷爱鸟类,尤其喜欢鸟儿婉转的歌声。
这天夜里,夜莺的歌声又吸引住了小W。由于长期的观察,小W已经能轻松地辨别出每只夜莺,并且给每只鸟儿都起了个只有英文字母的名字。夜莺歌声婉转,每只鸟在小W心中都有一个排名,排名是互不相同的。这次聆听后,小W心中的排名会发生一些变化。
具体地,对于一只夜莺,如果小W觉得DOWN了,就说明对她歌声的好感度就下降了,即排名下降了;如果觉得UP,则好感度上升,即排名上升了;如果是SAME,好感度不变,排名也仍然不变。
现在小W给了你现在的排名情况和这次聆听好感度的变化,他想让你猜一猜上一次的排名情况。由于情况众多,输出任何一种可能的排名情况都是允许的。
输入
第一行输入一个正整数n,表示夜莺的数目。
接下来n组输入,第一行为夜莺的名称,第二行为其排名的变化,UP表示升高,DOWN表示降低,SAME表示没有变化。注意,输入越靠前,排名越高。
输出
一共n行,每行一个字符串,表示为上次可能的排名。
样例输入 Copy
3 MISTIA UP XIAOSUIGU SAME LORELEI DOWN
样例输出 Copy
LORELEI XIAOSUIGU MISTIA
提示
样例解释
原先的排名从高到低为:LORELEI、XIAOSUIGU、MISTIA
现在的排名从高到低为:MISTIA、XIAOSUIGU、LORELEI
可见LORELEI的排名降低了,为DOWN;MISTIA的排名升高了,为UP;XIAOSUIGU的排名没有变,为SAME。符合输入。
对于30%的数据:n≤10。
对于60%的数据:n≤1000。
对于另外10%的数据:1≤n≤50000且所有排名信息第二行均为SAME。
对于100%的数据:1≤n≤50000,每只鸟儿的名字均由不超过100个大写英文字母组成
保证数据至少有一组解。
map其实效率不高。。。。。。。还不如二维数组。。。。。。。。。。。。。。
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N=100005;
struct node{
char name[105];
int p=0;
int g=0;
}nd[50005];
bool cmp(node x,node y)
{
return x.p<y.p;
}
int main()
{
int n;
cin>>n;
string s1="UP",s2="DOWN",s3="SAME",lev;
for(int i=1;i<=n;i++)
{
cin>>nd[i].name>>lev;
nd[i].p=i;
if(lev==s1) nd[i].g=1;
else if(lev==s2) nd[i].g=-1;
else if(lev==s3) nd[i].g=0;
}
// for(int i=1;i<=n;i++)
// printf("%s %d %d\n",nd[i].name,nd[i].p,nd[i].g);
for(int i=1;i<=n;i++)
{
if(nd[i].g==0) continue;
for(int j=i+1;j<=n;j++)
{
if(nd[j].g==0) continue;
if((nd[i].g==1)&&(nd[j].g==-1))
{
int tmp=nd[i].p;
nd[i].p=nd[j].p;
nd[j].p=tmp;
nd[i].g=0;
nd[j].g=0;
break;
}
}
}
sort(nd+1,nd+n+1,cmp);
for(int i=1;i<=n;i++)
printf("%s\n",nd[i].name);
return 0;
}
/**************************************************************
Problem: 15342
User: 2019UPC110
Language: C++
Result: 时间超限
****************************************************************/
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N=100005;
priority_queue<int,vector<int>,greater<int> >q1;
priority_queue<int,vector<int>,greater<int> >q2;
int a[50500];
map<int,string>mp;
int main()
{
int n;
scanf("%d",&n);
string str;
for(int i=1; i<=n; i++)
{
cin>>str;
mp[i]=str;
char lev[10]="";
scanf("%s",lev);
if(strcmp(lev,"UP")==0)
{
a[i]=1;
q1.push(i);
}
else if(strcmp(lev,"SAME")==0)
{
a[i]=0;
}
else if(strcmp(lev,"DOWN")==0)
{
a[i]=3;
q2.push(i);
}
}
for(int i=1; i<=n; i++)
{
if(a[i]==0)
cout<<mp[i]<<endl;
else if(!q2.empty())
{
int b=q2.top();
q2.pop();
cout<<mp[b]<<endl;
}
else if(!q1.empty())
{
int b=q1.top();
q1.pop();
cout<<mp[b]<<endl;
}
}
return 0;
}
/**************************************************************
Problem: 15342
User: 2019UPC110
Language: C++
Result: 时间超限
****************************************************************/
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
char s[50500][200]= {0};
int a[50500]= {0};
priority_queue<int,vector<int>,greater<int> >q1;
priority_queue<int,vector<int>,greater<int> >q2;
int main()
{
int n;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%s",s[i]);
char lev[10]="";
scanf("%s",lev);
if(strcmp(lev,"UP")==0)
{
a[i]=1;
q1.push(i);
}
else if(strcmp(lev,"SAME")==0)
{
a[i]=0;
}
else if(strcmp(lev,"DOWN")==0)
{
a[i]=3;
q2.push(i);
}
}
for(int i=0; i<n; i++)
{
if(a[i]==0)
printf("%s\n",s[i]);
else if(!q2.empty())
{
int b=q2.top();
q2.pop();
printf("%s\n",s[b]);
}
else if(!q1.empty())
{
int b=q1.top();
q1.pop();
printf("%s\n",s[b]);
}
}
return 0;
}
/**************************************************************
Problem: 15342
User: 2019UPC110
Language: C++
Result: 正确
Time:70 ms
Memory:12492 kb
****************************************************************/