第九届:
A. 2356 G1024
#include<iostream>
using namespace std;
int main(){
int n,k;
cin>>n>>k;
int x[k],m[k];
for(int i=0;i<k;i++)cin>>x[i]>>m[i];
for(int i=0;i<k;i++){
if((m[i]-x[i])>=n){
cout<<i+1;
return 0;
}
}
cout<<"G!";
return 0;
}
B. 2355 NEUQ
#include<iostream>
using namespace std;
int main(){
string s="NEUQ";
int num;cin>>num;
char a[1000005];
for(int i=0;i<num;i++)cin>>a[i];
int j=0;int ans=0;
for(int i=0;i<num;i++){
if(a[i]==s[j]){
j++;j%=4;
}
else ans++;
}
cout<<ans+j;
return 0;
}
C. 2358 小G的任务
#include<iostream>
using namespace std;
int main(){
int n;cin>>n;
int ans=0;
for(int i=1;i<=n;i++){
int j=i;
while(j>0){
ans+=j%10;
j/=10;
}
}
cout<<ans<<endl;
return 0;
}
D. 2351 nn与游戏
#include<iostream>
#include<queue>
#include<algorithm>
#include<string.h>
using namespace std;
int n,m;//n*n的地图,m个障碍
const int N=1e3+5;
int w[N][N]={0};//存图,己方为1,敌方为2,障碍物为-1
pair<int,int> a[N];//存可控制单位的坐标
pair<int,int> b[N];//存敌对单位的坐标
queue<pair<int,int> >q;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};//四个查找方向
int ans[N][N];//到某个点所需步数
int xt,yt;//记录目标点
void bfs(){
while(!q.empty())
{
int x=q.front().first;int y=q.front().second;
q.pop();
for(int i=0;i<4;i++){
int xx=x+dx[i];int yy=y+dy[i];
if(xx>=0&&xx<n&&yy>=0&&yy<n&&ans[xx][yy]==-1&&w[xx][yy]==0||(xx==xt&&yy==yt&&ans[xx][yy]==-1))
{
q.push(make_pair(xx,yy));
ans[xx][yy]=ans[x][y]+1;
}
}
}
}
int main(){
cin>>n>>m;
for(int i=0;i<m;i++)
{
int x,y;
cin>>x>>y;//存入障碍坐标
w[x][y]=-1;
}
int t;cin>>t;//有t个可控制单位和敌对单位
for(int i=0;i<t;i++)
{
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
a[i]=make_pair(x1,y1);
b[i]=make_pair(x2,y2);
w[x1][y1]=1;
w[x2][y2]=2;
}
for(int i=0;i<t;i++)
{
memset(ans,-1,sizeof(ans));
ans[a[i].first][a[i].second]=0;
q.push(a[i]);
xt=b[i].first;
yt=b[i].second;
bfs();
cout<<ans[b[i].first][b[i].second]<<endl;
}
return 0;
}
E. 2359 第二大数
#include<iostream>
using namespace std;
const int N=-2e9;
int a[10005];
int main(){
int n;cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
long long sum=0;
for(int i=1;i<=n-1;i++){
int a_max1=a[i];
int a_max2=0;
for(int j=i+1;j<=n;j++){
if(a[j]>a_max1){
a_max2=a_max1;
a_max1=a[j];
}
else if(a_max2<a[j])a_max2=a[j];
sum+=a_max2;
}
}
cout<<sum;
return 0;
}
F. 2349 Num
(超级简单一道题,两层循环都没有超时)
#include<iostream>
using namespace std;
int main(){
int n;cin>>n;
bool a=false;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i*j+i+j==n)a=true;
}
}
if(a)cout<<"Yes";
else cout<<"No";
return 0;
}
G. 2357 特征值
修改了一下之前写高精加的时候的代码做了一个函数,但是在这个题里面因为位数达不到题目给的5000位的精度,还是只过了2/3的数据
#include<iostream>
#include<string.h>
using namespace std;
string add(string a,string b){
int c[105]={0};
int al=a.length(),bl=b.length();
if(al<bl)
{
swap(a,b);
swap(al,bl);
}
for(int i=0;i<bl;i++){
c[i]+=a[al-1-i]-'0'+b[bl-1-i]-'0';
if(c[i]>=10){
c[i]-=10;
c[i+1]++;
}
}
for(int i=bl;i<al;i++){
c[i]+=a[al-1-i]-'0';
if(c[i]>=10){
c[i]-=10;
c[i+1]++;
}
}
if(c[al]==1)al++;
char w[105];
for(int i=0;i<=al-1;i++)
{
w[i]=c[i]+'0';
}
string s;
for(int i=al-1;i>=0;i--){
s=s+w[i];
}
return s;
}
int main(){
string ans;
string s;
cin>>s;
ans=s;
while(s.length()>0){
s.pop_back();
ans=add(ans,s);
}
cout<<ans;
return 0;
}
J 金牌厨师
在网上找到的思路,感觉这个题还是思路的逻辑更加重要,知道用什么方法之后就好做很多了。