B:素数
一个简单的模拟题,没什么可说的
直接看代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 10005
int prime[maxn];
bool Prime()
{
prime[1]=false;
for (int i = 2; i <= maxn; i++)
{
prime[i] = true;
}
for (int i = 1; i * i <= maxn; i++)
{
if (prime[i])
{
for (int j = i * i; j <= maxn; j += i)
{
prime[j] = false;
}
}
}
}
int main()
{
Prime();
int n;
scanf("%d",&n);
while(n--)
{
int x;
scanf("%d",&x);
if(prime[x])
{
printf("%d\n",x);
}
else
{
int dis_1=0,dis_2=0;
int id_1,id_2;
for(int i=x;;i++)
{
dis_1++;
if(prime[i])
{
id_1=i;
break;
}
}
for(int i=x;;i--)
{
dis_2++;
if(prime[i])
{
id_2=i;
break;
}
}
if(dis_1<=dis_2)
{
printf("%d\n",id_1);
}
else
{
printf("%d\n",id_2);
}
}
}
}
D:聪明的kk
一道经典又简单的动态规划
找一下状态即可
ac代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 1005
int dp[maxn][maxn];
int num[maxn][maxn];
int n,m;
void dp_s()
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
dp[i][j]=max(dp[i-1][j],dp[i][j-1])+num[i][j];
}
}
printf("%d\n",dp[n][m]);
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&num[i][j]);
}
}
dp_s();
}
C:网络的可靠性
一道简单的思路题,一开始以为是连通图,感觉还挺复杂的,没想到就记录一下入度和出度而已
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 10005
vector<int>vec[maxn];
//是任意一个点的出度和入度都大于1
int in[maxn],out[maxn];//出度和入度
int n;//代表边数
void input()
{
int u,v;
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
for(int i=1;i<n;i++)
{
scanf("%d %d",&u,&v);
//vec[u].push_back[v];
out[u]++;//u的出度++
in[v]++;//v的入度++
//vec[u].push_back[v];
out[v]++;
in[u]++;
}
}
void print()
{
int ans=0,id=0;
for(int i=1;i<=n;i++)
{
if(in[i]==0&&out[i]==0)
{
id++;
}
if(in[i]<2||out[i]<2)
{
ans++;
}
}
ans=id+ans/2+(ans%2!=0);
printf("%d\n",ans);
}
int main()
{
while(~scanf("%d",&n))
{
input();
print();
}
}
F: BUYING FEED
一道简单的贪心问题,主要是因为是英文题,没看懂,就凉凉了
AC代码:
#include<bits/stdc++.h>
using namespace std;
struct store{
int x,f,c;
};
bool cmp(struct store s1,struct store s2){
return s1.c<s2.c;
}
int main()
{
int C,k,e,n;
while(scanf("%d",&C)!=EOF){
while(C--){
cin>>k>>e>>n;
struct store st[n+2];
for(int i=0;i<n;i++){
scanf("%d%d%d",&st[i].x,&st[i].f,&st[i].c);
st[i].c+=e-st[i].x; //因为无论在哪个商店买东西都需要运送到终点,索性将单价加上路程费用创造新的单价,
}
sort(st,st+n,cmp); //将商店按照新单价 从小到排序
int sum1=0;
for(int i=0;i<n;i++){ //从新单价最小的买起,直至满足k
if(k>st[i].f){ //若k大于当前商店最大销售量,则直接买完
sum1+=st[i].f*st[i].c;
k-=st[i].f;
}else{ //能在此商店达到购买量k,则买到k,退出循环
sum1+=k*st[i].c;
break;
}
}
cout<<sum1<<endl;
}
}
return 0;
}
H :AMAZING AUCTION
一道简单的模拟题,也没啥可说的,直接模拟就行
AC代码:
#include<bits/stdc++.h>
using namespace std;
struct Node
{
string name;
int num;
}a[1005];
int main()
{
int u, m;
while(~scanf("%d%d", &u, &m))
{
string ans_name;
int ans;
for(int i = 0; i < 1005; i++)
a[i].num = 0;
for(int i = 1; i <= m; i++)
{
string ch;
int x;
cin>>ch>>x;
if(a[x].num == 0)
a[x].name = ch;
a[x].num++;
}
int temp = 1;
for(int i = 1; i <= u; i++)
{
if(a[i].num == temp) {ans_name = a[i].name; ans = i; break;}
if(i == u){temp++; i = 1;}
}
cout<<"The winner is "<<ans_name<<endl;
cout<<"The price is "<<ans<<endl;
}
}
A:房间安排
一道不太简单的思路题,可以用暴力写,枚举订单上重叠的天数然后加上房间量,然后比较最大值即可
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 10005
struct node
{
int s_t;//开始时间
int e_l;//结束时间
int d_n;//住宿间数
}temp[maxn];
int id[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(id,0,sizeof(id));
int maxx=~0x3f3f3f3f3f,n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d %d %d",&temp[i].d_n,&temp[i].s_t,&temp[i].e_l);
temp[i].e_l+=temp[i].s_t;
}
for(int i=0;i<n;i++)
{
for(int j=temp[i].s_t;j<temp[i].e_l;j++)
{
id[j]+=temp[i].d_n;
maxx=max(id[j],maxx);
}
}
printf("%d\n",maxx);
}
}