RC-U1
1.题目大意:有一个活动就是每周除星期四外只要气温不低于35℃就可以免费领取雪糕,给你两个数n,w(其中n代表天数,n∈[1,50];w代表第一天是星期几,w∈[1,7]),然后再给你n个数tn(ti∈(-273,60]),让你计算能领取雪糕的天数和虽然气温不低于35℃但是因为当天是星期四不能领雪糕的天数。
2.解题思路:模拟,没啥好说的
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,w;
scanf("%d%d",&n,&w);
int a=0,b=0;
for(int i=w;i<w+n;i++)
{
int x;
scanf("%d",&x);
if(x>=35)
{
if(i%7==4) b++;
else a++;
}
}
printf("%d %d",a,b);
return 0;
}
RC-U2
1.题目大意:给你一张表,一个名次对应一个分数(表的具体内容见代码,其中16~20名0分),总分=排名分数+杀敌分数。然后给你T组测试数据,每组有20行,分别是20名玩家的排名和杀敌个数,对于每组测试样例让你输出20行(按照序号从1~20输出)。
2.大致思路:还是模拟,还是没啥好说的
#include<bits/stdc++.h>
using namespace std;
const int N=25;
int score[N];
int get_score(int p,int k)
{
int res=k;
if(p==1) res+=12;
else if(p==2) res+=9;
else if(p==3) res+=7;
else if(p==4) res+=5;
else if(p==5) res+=4;
else if(p==6||p==7) res+=3;
else if(8<=p&&p<=10) res+=2;
else if(11<=p&&p<=15) res++;
return res;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
for(int i=1;i<=20;i++)
{
int p,k;
scanf("%d%d",&p,&k);
score[i]+=get_score(p,k);
}
}
for(int i=1;i<=20;i++)
{
printf("%d %d",i,score[i]);
if(i<20) puts("");
}
return 0;
}
RC-U3
1.题目大意:给你一张图,已知图中有感觉温暖的水豚('w')、感觉寒冷的水豚(’c‘)、暖气炉('m')以及空白区域('.')。这张图可能不合法,并且如果不合法,那个不合法的肯定是一只温暖的水豚,然后让你求使得这张图从不合法变为合法的暖气片的全部可能区域,并按照行从小到大排序输出(如果行号相同,按照列号从小到大排序输出)。如果不存在,输出“Too Cold!”(不带引号)。
2.大致思路:还是模拟,不过这道题有坑点,就是当这张图合法时,即不存在使得这张图从不合法变为合法的暖气片,另外还需要注意当扫描到空白区域时,还要对空白区域周围进行扫描,如果周围不存在感觉寒冷的水豚,答案合法,否则答案不合法。最后用一个小根堆存储所有合法答案,不断取出堆顶元素,直到堆为空。
#include<bits/stdc++.h>
using namespace std;
using PII=pair<int,int>;
const int N=1010;
int n,m;
char g[N][N];
vector<PII> warming,heat_waves;
PII illegal;
bool check(int x,int y)
{
for(int i=x-1;i<=x+1;i++)
for(int j=y-1;j<=y+1;j++)
{
if(i<1||i>n||j<1||j>m) continue;
if(g[i][j]=='m') return true;
}
return false;
}
bool check1(int x,int y)
{
for(int i=x-1;i<=x+1;i++)
for(int j=y-1;j<=y+1;j++)
{
if(i<1||i>n||j<1||j>m) continue;
if(g[i][j]=='c') return false;
}
return true;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%s",g[i]+1);
for(int j=1;j<=m;j++)
{
char c=g[i][j];
if(c=='w') warming.push_back({i,j});
else heat_waves.push_back({i,j});
}
}
bool is_legal=true;
for(auto item:warming)
if(!check(item.first,item.second))
{
illegal=make_pair(item.first,item.second);
is_legal=false;
break;
}
if(is_legal) return !puts("Too cold!");
priority_queue<PII,vector<PII>,greater<PII>> heap;
int x=illegal.first,y=illegal.second;
for(int i=x-1;i<=x+1;i++)
for(int j=y-1;j<=y+1;j++)
{
if(i<1||i>n||j<1||j>m) continue;
//printf("g[%d][%d]=%c\n",i,j,g[i][j]);
if(g[i][j]=='.')
if(check1(i,j)) heap.push({i,j});
}
if(!heap.size()) puts("Too cold!");
while(heap.size())
{
auto t=heap.top();
heap.pop();
printf("%d %d\n",t.first,t.second);
}
return 0;
}
4.RC-U4
题目大意:给你章鱼图的概念,就是图中只有一个环的大于两个点的无向连通图,然后给你几张无向图,问你是否只有一个章鱼子图。如果是,输出"Yes"(不带引号,下同)和环中包含点的个数,否则输出“No”和章鱼子图的个数。
这道题我也不会,希望看到的大佬给我指点一下555555......
5.RC-U5
题目大意:给你几组测试样例,然后给你每份工作需要的时间、最晚完成的时间和报酬,然后问你这个人获得的最大报酬是多少。
错误代码:
(贪心,按照报酬大小从大到小排列,相同的话按照最晚完成的时间从早到晚排列,如果还相同按照完成用时从短到长排列,21pts,测试点4和6答案错误)
#include<bits/stdc++.h>
using namespace std;
const int N=5010;
struct Work
{
int t,d,p;
bool operator<(const Work &w)const
{
if(p!=w.p) return p>w.p;
if(d!=w.d) return d<w.d;
return t<w.t;
}
}works[N];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int t,d,p;
scanf("%d%d%d",&t,&d,&p);
works[i]={t,d,p};
}
sort(works,works+n);
int ans=0;
for(int i=0;i<n;i++)
{
int tmp=0,time_elapsed=0;
for(int j=i;j<n;j++)
{
if(time_elapsed+works[j].t<=works[j].d)
{
time_elapsed+=works[j].t;
tmp+=works[j].p;
//cout<<"Elapsed time:"<<time_elapsed<<endl;
//cout<<"Earned money:"<<tmp<<endl;
}
}
ans=max(ans,tmp);
}
printf("%d\n",ans);
}
return 0;
}
(01背包变形,22pts,测试点6答案错误)
#include<bits/stdc++.h>
using namespace std;
const int N=5005;
int t[N],d[N],p[N];
int f[N];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(f,0,sizeof f);
int n;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d%d%d",&t[i],&d[i],&p[i]);
for(int i=0;i<n;i++)
for(int j=d[i];j>=t[i];j--)
f[j]=max(f[j],f[j-t[i]]+p[i]);
int ans=0;
//for(int i=0;i<=sum;i++) printf("f[%d] = %d\n",i,f[i]);
for(int i=0;i<N;i++) ans=max(ans,f[i]);
printf("%d\n",ans);
}
return 0;
}
希望看到的大佬能帮我看看这两个代码都错在哪里了,谢谢。