特殊的正方形
思路:简单的模拟题。
代码:
#include<bits/stdc++.h>
using namespace std;
char mapp[1001][1001];
int n;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
mapp[i][j]='0';
}
}
for(int i=1;i<=n/2+1;i++){
for(int j=i;j<=n-i+1;j++)mapp[i][j]=mapp[j][i]=(i%2==0?'.':'+');
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(mapp[i][j]!='0')cout<<mapp[i][j];
else cout<<mapp[n-i+1][n-j+1];
}
cout<<endl;
}
return 0;
}
走楼梯。
思路:思路与普通的走楼梯相同,只不过被细分为更加精细的状态。
代码:
#include<bits/stdc++.h>
using namespace std;
long long f[1000][3];//f[i][j]表示在i阶已经用2走了几次
int main(){
int n;
cin>>n;
f[1][0]=1;
f[2][0]=1,f[2][1]=1;
for(int i=3;i<=n;i++){
f[i][0]=f[i-1][0]+f[i-1][1]+f[i-1][2];
f[i][1]=f[i-2][0];
f[i][2]=f[i-2][1];
}
cout<<f[n][0]+f[n][1]+f[n][2];
return 0;
}
走路。
思路:本质上是一种带有状态的拓展。用book标记状态。
代码:
#include<bits/stdc++.h>
using namespace std;
int a[100010],b[100010],book[100010];
int n,m;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i]>>b[i];
book[a[1]]=book[b[1]]=1;
for(int j=2;j<=n;j++){
for(int i=100000;i>=0;i--){
if(i-a[j]>=0 && book[i-a[j]]==j-1)book[i]=j;
if(i-b[j]>=0 && book[i-b[j]]==j-1)book[i]=j;
}
//for(int i=1;i<=m;i++)cout<<book[i]<<" ";
//cout<<endl;
}
for(int i=0;i<=m;i++){
if(book[i]==n)cout<<'1';
else cout<<"0";
}
return 0;
}
简单的分数统计。
思路:简单的map模拟。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,k,ce;
map<string, int>EVA;
map<string, int>ti;
string name[1000];
int main(){
cin>>n>>k>>ce;
for(int i=1;i<=n;i++)cin>>name[i],EVA[name[i]]=0;
for(int i=1;i<=k;i++){
int a;
string str;
cin>>str>>a;
ti[str]=a;
}
for(int i=1;i<=ce;i++){
string s1,s2,s3;
cin>>s1>>s2>>s3;
EVA[s1]+=(s3=="AC"?ti[s2]:0);
}
for(int i=1;i<=n;i++){
cout<<name[i]<<" "<<EVA[name[i]]<<endl;
}
return 0;
}
德州扑克。
思路:建议使用函数来封装判断函数。
代码:
#include<bits/stdc++.h>
using namespace std;
int dian[100010];
int hua[100010];
int n;
bool lian(){
for(int i=1;i<=n-1;i++){
if(dian[i+1]-dian[i]!=1)return 0;
}
return 1;
}
bool tonghua(){
for(int i=1;i<=n-1;i++){
if(hua[i+1]-hua[i]!=0)return 0;
}
return 1;
}
bool sitiao(){
int book[100];
memset(book,0,sizeof(book));
for(int i=1;i<=n;i++){
book[dian[i]]++;
}
for(int i=1;i<=n;i++){
if(book[dian[i]]>=4)return 1;
}
return 0;
}
bool hulu(){
int book[100];
bool S_2=0;
bool S_3=0;
memset(book,0,sizeof(book));
for(int i=1;i<=n;i++){
book[dian[i]]++;
}
for(int i=1;i<=n;i++){
if(book[dian[i]]==3)S_3=1;
if(book[dian[i]]==2)S_2=1;
}
return S_3&&S_2;
}
int main(){
n=5;
for(int i=1;i<=n;i++)cin>>dian[i];
for(int i=1;i<=n;i++)cin>>hua[i];
if(lian() && tonghua() && dian[n]==14)cout<<"ROYAL FLUSH";
else if(lian() && tonghua())cout<<"STRAIGHT FLUSH";
else if(sitiao())cout<<"FOUR OF A KIND";
else if(hulu())cout<<"FULL HOUSE";
else if(tonghua())cout<<"FLUSH";
else if(lian())cout<<"STRAIGHT";
else cout<<"FOLD";
return 0;
}
订单编号。
思路:简单的二分查找+跳跃优化。
代码:
#include<bits/stdc++.h>
using namespace std;
int cnt=0;
int ce[500010],a[500010];
int main(){
int N;
cin>>N;
ce[0]=0;
ce[1]=1e9;
cnt=1;
for(int i=1;i<=N;i++){
cin>>a[i];
int l=0;
int r=cnt;
while(l+5<r){
int mid=(l+r)/2;
if(a[i]>=ce[mid])l=mid;
else r=mid;
}
int j=l;
for(;j<=r;j++){
if(ce[j]>=a[i])break;
}
while(ce[j]==a[i])a[i]++,j++;
int yuanj=j;
for(j=cnt+1;j>yuanj;j--)ce[j]=ce[j-1];
ce[yuanj]=a[i];
cnt++;
}
for(int i=1;i<=N;i++)cout<<a[i]<<" ";
return 0;
}
饿饿 饭饭
思路:先将需求从小到大排序,筛出一部分人,再将剩余的人用链表处理,然而还是T了一个点,于是就用了一个小优化使链表处理只经过一次。
代码:
#include<bits/stdc++.h>
using namespace std;
long long n,a[100010],k,b[100010];
int main(){
cin>>n>>k;
long long sum=0;
for(long long i=1;i<=n;i++)cin>>a[i],sum+=a[i],b[i]=a[i];
if(sum<k){
cout<<"-1"<<endl;
return 0;
}
sum=0;
long long js=0;
long long preid=1;
sort(a+1,a+n+1);
for(long long i=1;i<=n-1;i++){
if(a[i]!=a[i+1]){
if(js+(n-preid+1)*a[i]>k)break;
js+=(n-preid+1)*a[i];
preid=i+1;
sum=a[i];
}
}
k-=js;
// cout<<"------------------"<<endl;
// for(long long i=1;i<=n;i++){
// if(b[i]<=sum)continue;
// else cout<<b[i]-sum<<" ";
// }
// cout<<endl;
// for(long long i=1;i<=n;i++){
// if(b[i]<=sum)continue;
// else cout<<i<<" ";
// }
// cout<<endl<<k<<endl;
// cout<<"-------------------"<<endl;
long long pre[100001];
long long to[100001];
long long wei=0;
long long cnt=0;
for(long long i=1;i<=n;i++){
if(b[i]>sum)b[i]-=sum,to[wei]=i,pre[i]=wei,wei=i,cnt++;
}
//cout<<"cnt="<<cnt<<endl;
to[wei]=100000;
pre[100000]=wei;
while(1){
wei=0;
if(k==0)break;
while(to[wei]!=100000){
wei=to[wei];
b[wei]--;
//cout<<"wei:"<<wei<<" b[wei]="<<b[wei]<<endl;
if(b[wei]==0){
to[pre[wei]]=to[wei];
pre[to[wei]]=pre[wei];
cnt--;
}
k--;
if(k==0)break;
}
if(k==0)break;
}
wei=to[wei];
while(cnt){
cout<<wei<<" ";
wei=to[wei];
if(wei==100000)wei=to[0];
cnt--;
}
return 0;
}
任务分配。
思路:简单的dp,但是牵涉到很重要的dp的思路,后续对前面无影响
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
int dp[1000010];
struct EVA{
int s,e,val;
}cjc[10000];
bool cmp(EVA a,EVA b){
return a.e<b.e;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>cjc[i].s>>cjc[i].e>>cjc[i].val;
}
sort(cjc+1,cjc+n+1,cmp);
int wei=1;
for(int i=1;i<=cjc[n].e;i++){
dp[i]=dp[i-1];
while(i==cjc[wei].e)dp[i]=max(dp[i],dp[cjc[wei].s]+cjc[wei].val),wei++;
}
cout<<dp[cjc[n].e];
return 0;
}